Jay*_*Jay 23 linux bash ubuntu
我有大量的格式文件x00000.jpg
,X00000.jpg
和xx00000.jpg
.
如何重命名这些文件,使它们都是大写的,忽略名称的数字部分?
dam*_*ois 22
for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done
Run Code Online (Sandbox Code Playgroud)
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)
如果文件也在子目录中,您可以使用 globstar或find
:
find . -maxdepth 1 -type f -iname "*.jpg" -execdir rename "y/a-z/A-Z/" {} +
Run Code Online (Sandbox Code Playgroud)
所述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.jpg
和X00000.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)
归档时间: |
|
查看次数: |
30836 次 |
最近记录: |