我有 1000 多张图片,我需要重命名它们,所以我首先在 20 张图片上测试我的命令。它们被命名为
cropped1.jpg cropped2.jpg cropped3.jpg ... cropped20.jpg
我想将它们重命名为
21.jpg 22.jpg 23.jpg ... 40.jpg
所以我使用这个命令
for i in {1..20}; do rename "s/"cropped"$i/$(expr $i + 20)/" * ; done
但我的输出是出乎意料的。输出是:
210.jpg 212.jpg 214.jpg 216.jpg 218.jpg 21.jpg 22.jpg 24.jpg 26.jpg 28.jpg 211.jpg 213.jpg 215.jpg 217.jpg 219.jpg 220.jpg 23.jpg 25.jpg 27.jpg 29.jpg
那么我哪里错了?
答案1
不要在重命名命令中混合使用 shell 和 Perl 代码;这都是关于 Perl 的。使用以下命令:
rename -n 's/cropped(\d+)/$1 + 20/e' cropped*.jpg
-n
当输出看起来不错时移除开关。
如果你坚持使用这种肮脏的方式,请不要使用 glob *
,而是使用当前文件和现代 shell:
for i in {1..20}; do
test -s "cropped$i.jpg" && rename "s/cropped$i/$(($i + 20))/" "cropped$i.jpg"
done
我删除了expr
,这是过时的。
还有其他同名的工具可能能够或不能做到这一点,所以要小心。
如果你运行以下命令
$ file "$(readlink -f "$(type -p rename)")"
并且您得到的结果包含Perl script, ASCII text executable
,但不包含ELF
,那么这似乎是正确的工具=)
如果不是,则将其设为默认值(通常已经是这种情况):
$ sudo update-alternatives --set rename /path/to/rename
替换/path/to/rename
为您的 Perl 可执行文件的路径rename
。
如果你没有此命令,请搜索你的包管理器来安装它或手动操作(无依赖……)