Bash - 'Image (x).png' ファイルの名前を変更する

Bash - 'Image (x).png' ファイルの名前を変更する

Image.pngたとえば、、Image (2).pngなどの Windows スキャン ファイルがたくさんありました... 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 で始まり、任意の数の 1 つ以上のスペース、リテラルの開き括弧 ( および 1 つ以上の数字 \d+ と閉じ括弧 ) が続き、.png で終わるファイル名と一致します。

答え2

ファイルが と呼ばれImage.pngImage (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は、ゼロで埋められた 2 文字幅の整数バージョンになります$i

関連情報