我有一堆 Windows 扫描文件,例如Image.png
、Image (2).png
、...
Image (19).png
。
我需要将它们重命名为,Image01.png
...
Image19.png
这样我就可以将它们扔到imagemagick
转换命令中,以便将它们按顺序分页到输出 pdf 中。
这是我最终使用的命令:
ls * | awk '{print "mv \""$0"\" \"2"$0"2\"" }' | sed -e 's/2Image (/Image0/' | sed -e 's/).png2/.png/' | sed -e 's/[0-9]\([0-9][0-9]\)/\1/' | sed -e 's/2Image.png2/Image01.png/' | sh
这是可行的,但是有一种更简洁的方法可以做到这一点,它不涉及使用肮脏/有缺陷的占位符,例如插入随机2
字符来使重命名工作。
答案1
rename 's/^Image\.png$/Image01.png/ || s/^Image\s+\((\d+)\)\.png$/sprintf "%s%02d.png", "Image", $1/e' *.png
方法
- 该
rename
实用程序是您场景中的最佳选择。它的工作模型如下:获取文件名列表并对Perl
每个文件名应用有效的转换,转换后的结果将成为文件名的新名称。 - s/^Image.png$/Image(01).png/ => 这是用于处理 Image.png 文件。
- s/^Image\s+((\d+)).png$/ => 匹配以 Image 开头的文件名,然后是任意数量的一个或多个空格,后跟一个文字左括号(以及一个或多个数字 \d+ 和一个右括号)并以 .png 结尾。
答案2
由于您知道文件被调用Image.png
并且Image (2).png
虽然为Image (19).png
,所以不需要正则表达式:
mv Image.png Image01.png
for i in {2..19}; do
zi=$( printf '%02d' "$i" )
mv "Image ($i).png" "Image$zi.png"
done
$zi
将是 的零填充的两个字符宽整数版本$i
。