Bash - 重命名“Image (x).png”文件

Bash - 重命名“Image (x).png”文件

我有一堆 Windows 扫描文件,例如Image.pngImage (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

相关内容