Linux将文件重命名为大写

Jay*_*Jay 23 linux bash ubuntu

我有大量的格式文件x00000.jpg,X00000.jpgxx00000.jpg.

如何重命名这些文件,使它们都是大写的,忽略名称的数字部分?

dam*_*ois 22

for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done
Run Code Online (Sandbox Code Playgroud)

  • 但为什么要使用 subshel​​l、fork 和 here-string 呢?`"${f^^}"` 就足够了。 (2认同)
  • tr的参数也应引用.考虑一下`touch lu; tr [:lower:] [:upper:] <<<"hello world"` (2认同)

pts*_*pts 13

您不能仅从Bash重命名文件,因为Bash没有任何用于重命名文件的内置命令.您必须至少使用一个外部命令.

如果允许Perl:

perl -e 'for(@ARGV){rename$_,uc}' *.jpg
Run Code Online (Sandbox Code Playgroud)

如果允许Python:

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

如果您有数千或更多文件,则上述解决方案速度很快,以下解决方案速度明显较慢.

如果是AWK,ls并且mv被允许:

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

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

如果tr并且mv被允许,那么请参阅damienfrancois的回答.

如果mv允许:

for file in *; do mv -- "$file" "${file^^}"; done
Run Code Online (Sandbox Code Playgroud)

请注意,这些重命名.jpg.JPG最后,但您可以修改它们以避免这种情况.


Pab*_*o A 12

rename

重命名多个文件的最简单方法可能是使用rename. 要将小写名称转换为大写,您需要:

rename 'y/a-z/A-Z/' *
Run Code Online (Sandbox Code Playgroud)

如果文件也在子目录中,您可以使用 globstarfind

find . -maxdepth 1 -type f -iname "*.jpg" -execdir rename "y/a-z/A-Z/" {} +
Run Code Online (Sandbox Code Playgroud)

参考


Kei*_*son 8

所述bash外壳具有用于翻译变量名全部大写的句法.

for file in * ; do      # or *.jpg, or x*.jpg, or whatever
    mv $file ${file^^}
done
Run Code Online (Sandbox Code Playgroud)

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

此功能的文档在此处,或键入info bash并搜索"upper".

你应该决定做什么,如果目标文件已经存在(比如,如果同时x00000.jpgX00000.JPG已经存在),除非你确定它是不是一个问题.要检测此类名称冲突,您可以尝试:

ls *.txt | tr '[a-z]' '[A-Z]' | sort | uniq -c | sort -n
Run Code Online (Sandbox Code Playgroud)

并寻找任何不以开头的行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
Run Code Online (Sandbox Code Playgroud)

  • 这有效并且不会弄乱文件扩展名大小写,即它保持 .jpg 而不是 .JPG (2认同)