多数のファイル名で数値列を置き換える方法

多数のファイル名で数値列を置き換える方法

次のような名前の多くのファイル名を変更したいと思います。

cc cc nn - ccccccc ccc cccccccc - nnnnnn.mp3

ここで、「c」は文字を表し、「n」は数字を表す。

cc cc nn - ccccccc ccc cccccccc - nnnnnn.mp3
                                  ^^^^^^ these (^) are the numbers I want to change.

000001、000002、...、084521同じ数が欲しい

私はLinuxを使用しており、一般的なコマンドラインツールのすべてを使用できます。

デフォルトでは、ファイル名の場所35〜40を計算中の数字に置き換えたいと思います。

答え1

Ubuntuを含むDebianベースのシステムで呼び出される場合は、次のことができますperl-renamerename

rename -n 's/\d+.mp3$/sprintf("%06d",$c++) . ".mp3"/e' *mp3

説明する

  • 何も名前を変更せずに実行するジョブのみを印刷します-nrenameコマンドが必要に応じて機能することを確認したら、削除してください。
  • s/foo/bar/e:これは代替演算子ですfoobar最後の演算子は、e演算子の右側にあるすべてのコマンドを評価し、その出力に置き換えます。
  • \d+.mp3$.mp3:ファイル名で終わる最も長い数字と一致します()$
  • sprintf("%06d",++$c) . ".mp3":このsprintfコマンドは変数の内容を印刷します$c。 1を追加すると、前に6つのゼロがあります。$cコマンドが最初に実行されたときに初期化されないため、1に++$cなります。次に、に接続します.mp3

これらすべての最終結果は、拡張前の数字を増加するゼロパディング数字に置き換えることです。

$ rename -n 's/\d+.mp3$/sprintf("%06d",++$c) . ".mp3"/e' *mp3
cc cc nn - ccccccc ccc cccccccc - 123401.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000001.mp3
cc cc nn - ccccccc ccc cccccccc - 123402.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000002.mp3
cc cc nn - ccccccc ccc cccccccc - 123403.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000003.mp3
cc cc nn - ccccccc ccc cccccccc - 123404.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000004.mp3
cc cc nn - ccccccc ccc cccccccc - 123405.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000005.mp3
cc cc nn - ccccccc ccc cccccccc - 123406.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000006.mp3
cc cc nn - ccccccc ccc cccccccc - 123407.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000007.mp3
cc cc nn - ccccccc ccc cccccccc - 123408.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000008.mp3
cc cc nn - ccccccc ccc cccccccc - 123409.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000009.mp3
cc cc nn - ccccccc ccc cccccccc - 123410.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000010.mp3
cc cc nn - ccccccc ccc cccccccc - 123411.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000011.mp3
cc cc nn - ccccccc ccc cccccccc - 123412.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000012.mp3
cc cc nn - ccccccc ccc cccccccc - 123413.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000013.mp3
cc cc nn - ccccccc ccc cccccccc - 123414.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000014.mp3
cc cc nn - ccccccc ccc cccccccc - 123415.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000015.mp3
cc cc nn - ccccccc ccc cccccccc - 123416.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000016.mp3
cc cc nn - ccccccc ccc cccccccc - 123417.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000017.mp3
cc cc nn - ccccccc ccc cccccccc - 123418.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000018.mp3
cc cc nn - ccccccc ccc cccccccc - 123419.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000019.mp3
cc cc nn - ccccccc ccc cccccccc - 123420.mp3 -> cc cc nn - ccccccc ccc cccccccc - 000020.mp3

答え2

シェルスクリプトで:

tempdir="$(mktemp -d)"
i=0; for file in *.mp3; do
  i=$((i+1))
  mv -- "$file" "$tempdir/${file%%[0-9]*.mp3}$(printf '%06d.mp3' "$i")"
done
mv "$tempdir"/* . && rmdir "$tempdir"

mp3ディレクトリからこのスクリプトを実行してください。既に存在するファイル名に名前が変更されないように、一時ディレクトリを作成し、名前が変更されたファイルをそのディレクトリに移動します。すべてのファイルが処理されると、そのファイルは現在のディレクトリに戻ります。

ファイル名を繰り返すときは、ファイル名から既存のサフィックスを削除し、ターゲットファイル${file%%[0-9]*.mp3}名にプレフィックスのない新しいサフィックスを追加します。nnnnnn.mp3$(printf '%06d.mp3' "$i")

関連情報