从重命名命令获取意外的输出

从重命名命令获取意外的输出

我有 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


如果你没有此命令,请搜索你的包管理器来安装它或手动操作(无依赖……)

相关内容