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

相關內容