假设我有一堆Mac屏幕截图文件:
Screen Shot 2018-11-09 at 12.37.37 PM.png
Screen Shot 2018-11-10 at 4.53.02 PM.png
Screen Shot 2018-11-10 at 9.19.19 PM.png
我想用mv将它们标记为:
Screen_0.png
Screen_1.png
Screen_2.png
我想出的部分命令:
find . -name "Screen*" -exec sh -c 'mv "$1" "Screen_$2"' _ {} ??? \;
如何实现命令以使其可以按数字标记图像?还是我不得不求助于更复杂的文件。
答案 0 :(得分:2)
我认为无法按照您希望的方式传递序列号xargs
。而是使用一个简单的循环:
#!/bin/bash
for file in Screen*.png; do
[[ -f $file ]] || continue # skip if not a regular file
mv "$file" "Screen_$((count++)).png"
done
答案 1 :(得分:2)
您可以只使用rename
,也就是Perl重命名:
rename --dry-run 's/.*/Screen_$N.png/' Screenshot*png
示例输出
'Screenshot 2018-11-12 at 11.54.32.png' would be renamed to 'Screen_1.png'
'Screenshot 2018-11-12 at 11.54.38.png' would be renamed to 'Screen_2.png'
'Screenshot 2018-11-12 at 11.54.42.png' would be renamed to 'Screen_3.png'
如果您喜欢输出的外观,请在没有--dry-run
的情况下再次运行。
如果您使用的是macOS,则可以使用 homebrew 安装Perl rename
:
brew install rename
答案 2 :(得分:1)
如果使用数组,则无需进行任何算术运算,只需使用每个元素的索引即可:
#!/bin/bash
files=('Screen Shot'*.png)
for i in "${!files[@]}" ; do
mv "${files[i]}" Screen_$i.png
done
答案 3 :(得分:1)
使用Perl一个衬板,您也可以轻松做到。
> ls -1 Screen*
Screen Shot 2018-11-09 at 12.37.37 PM.png
Screen Shot 2018-11-10 at 4.53.02 PM.png
Screen Shot 2018-11-10 at 9.19.19 PM.png
> perl -ne ' BEGIN { for(glob("Screen*")) { rename "$_", "Screen_".$x++.".png" } ; exit }'
> ls -1 Screen*
Screen_0.png
Screen_1.png
Screen_2.png
>