我有大量的格式x00000.jpg
,X00000.jpg
和xx00000.jpg
文件。
如何重新命名这些文件,以便他们都是大写的,忽略了名的数字部分?
for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done
您不能从猛砸仅重命名文件,因为击不具有重命名文件的任何内置命令。你必须使用至少一个外部命令为。
如果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,ls
和mv
被允许:
# Insecure if the filenames contain an apostrophe or newline!
eval "$(ls -- *.jpg | awk '{print"mv -- \x27"$0"\x27 \x27"toupper($0)"\x27"}')"
如果你有大量的文件,这些解决方案上面不起作用,因为*.jpg
扩展为一个太长的参数列表(错误:参数列表过长)。
如果tr
和mv
是允许的,然后看看damienfrancois的回答。
如果mv
被允许:
for file in *; do mv -- "$file" "${file^^}"; done
请注意,这些重命名.jpg
在年底.JPG
,但你可以修改它们,以避免这一点。
该bash
壳具有用于翻译变量名全部大写的句法。
for file in * ; do # or *.jpg, or x*.jpg, or whatever
mv $file ${file^^}
done
我觉得这可能是一个相当新的功能,所以首先确认您的bash
版本实现它。为了避免错误,请尝试一次更换mv
通过echo mv
,只是为了确保它会做你想要什么。
此功能的文档here,或键入info bash
并搜索“上”。
你应该决定做什么,如果目标文件已经存在(比如,如果两个x00000.jpg
和X00000.JPG
已经存在),除非你确定它是不是一个问题。为了检测这种名称冲突,你可以试试:
ls *.txt | tr '[a-z]' '[A-Z]' | sort | uniq -c | sort -n
并查找任何行不1
开始。
结合以前的答案可能会产生:
for file in * ; do # or *.jpg, or x*.jpg, or whatever
basename=$(tr '[:lower:]' '[:upper:]' <<< "${file%.*}")
newname="$basename.${file#*.}"
mv "$file" "$newname"
done
使用TR:
f="x00000.jpg"
n="${f%.*}"
n=$(tr '[:lower:]' '[:upper:]' <<< "$n")
f="$n.${f#*.}"
echo "$f"
OUTPUT:
X00000.jpg
rename
也许最简单的方法就是rename
多个文件。要转换小写名称上,你会:
rename 'y/a-z/A-Z/' *