Linux的文件重命名为大写

问题描述 投票:20回答:7

我有大量的格式x00000.jpgX00000.jpgxx00000.jpg文件。

如何重新命名这些文件,以便他们都是大写的,忽略了名的数字部分?

linux bash ubuntu
7个回答
21
投票
for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done

13
投票

您不能从猛砸仅重命名文件,因为击不具有重命名文件的任何内置命令。你必须使用至少一个外部命令为。

如果Perl是允许的:

perl -e 'for(@ARGV){rename$_,uc}' *.jpg

如果Python是允许的:

python -c 'import os, sys; [os.rename(a, a.upper()) for a in sys.argv[1:]]' *.jpg

如果你有十万以上的文件,上面的解决方案是快,下面的解决方案是noticably慢。

如果AWK,lsmv被允许:

# Insecure if the filenames contain an apostrophe or newline!
eval "$(ls -- *.jpg | awk '{print"mv -- \x27"$0"\x27 \x27"toupper($0)"\x27"}')"

如果你有大量的文件,这些解决方案上面不起作用,因为*.jpg扩展为一个太长的参数列表(错误:参数列表过长)。

如果trmv是允许的,然后看看damienfrancois的回答。

如果mv被允许:

for file in *; do mv -- "$file" "${file^^}"; done

请注意,这些重命名.jpg在年底.JPG,但你可以修改它们,以避免这一点。


8
投票

bash壳具有用于翻译变量名全部大写的句法。

for file in * ; do      # or *.jpg, or x*.jpg, or whatever
    mv $file ${file^^}
done

我觉得这可能是一个相当新的功能,所以首先确认您的bash版本实现它。为了避免错误,请尝试一次更换mv通过echo mv,只是为了确保它会做你想要什么。

此功能的文档here,或键入info bash并搜索“上”。

你应该决定做什么,如果目标文件已经存在(比如,如果两个x00000.jpgX00000.JPG已经存在),除非你确定它是不是一个问题。为了检测这种名称冲突,你可以试试:

ls *.txt | tr '[a-z]' '[A-Z]' | sort | uniq -c | sort -n

并查找任何行不1开始。


7
投票

结合以前的答案可能会产生:

for file in * ; do            # or *.jpg, or x*.jpg, or whatever
   basename=$(tr '[:lower:]' '[:upper:]' <<< "${file%.*}")
   newname="$basename.${file#*.}"
   mv "$file" "$newname"
done

3
投票

使用TR:

f="x00000.jpg"
n="${f%.*}"
n=$(tr '[:lower:]' '[:upper:]' <<< "$n")
f="$n.${f#*.}"
echo "$f"

OUTPUT:

X00000.jpg

3
投票

rename

也许最简单的方法就是rename多个文件。要转换小写名称上,你会:

rename 'y/a-z/A-Z/' *

References


0
投票

如果只重命名文件/显示目录是你想要的,那么你可以使用rnm

rnm -rs '/./\C/g' -fo -dp -1 *

说明:

  1. -rs:替换字符串。 /./\C/g取代.(正则表达式)的所有比赛,以它的大写。
  2. -fo:文件只模式
  3. -dp:目录的深度(指无限-1)。

更多的例子可以发现here

© www.soinside.com 2019 - 2024. All rights reserved.