でもファイル名を変更する

でもファイル名を変更する

本のスキャンページ画像をいくつか収集しました。総ページ数は約10,000ページです。本は、両面ページにテキストと翻訳を含む2言語で印刷されます。翻訳は破棄され、元のページ、つまり偶数ページだけが残ります。

正しいページ番号を含めるにはファイル名が必要で、現在は単純な順序で行われています。使いやすいrenameか似ています。

わかりやすくするために、現在の文書番号付け形式は次のとおりです。

1-001.png
1-002.png
1-003.png
 ...

最初の数字1はロール番号であり、変更されません。 2番目の数字はページ番号で、次のように変更する必要があります。

1-002.png
1.004.png
1-006.png
 ...

ベストアンサー1

名前変更コマンドは次のとおりです。

rename -n 'our $i=2;s/^(\d+)-(\d+)/sprintf("$1-%04d", $i*$2)/e' *.png

結果:

1-001.png renamed as 1-0002.png
1-002.png renamed as 1-0004.png
1-003.png renamed as 1-0006.png
1-004.png renamed as 1-0008.png
1-005.png renamed as 1-0010.png
...
2-001.png renamed as 2-0002.png
2-002.png renamed as 2-0004.png
2-003.png renamed as 2-0006.png
2-004.png renamed as 2-0008.png
2-005.png renamed as 2-0010.png
-n、--何もしない
            アクションなし:名前が変更されたファイルを表示します。

our $i私はPerlグローバル変数設定に使用する値です2

(\d+)-(\d+)(\d+)ファイル名の先頭を1つ以上の数字と一致させ、それをグループとしてキャプチャしてから、ファイル名のダッシュ-(\d+))の後のすべての数字を一致させて-グループとしてキャプチャします。

^最初は()と同じ数字で始まらない場合は、ファイル名の変更を防止/スキップし、で始まる場合にのみファイル名を変更するようにしてください^(\d+)-(\d+)^a11.001.pngdigit-digit.png

sprintf("$1-%04d", $i*$2):最初に$1インデックス(またはその逆参照)を使用してグループキャプチャを印刷し(最初の項目を参照(\d+))、最大フィールド幅が4()のグループの新しく計算された値を印刷し、空のフィールド^(\d+)-(\d+)をゼロで埋めます( )。$2%4d%04d

注:コマンド%04dで使用した理由は、sprintf名前をに変更しようとする1-001.png1-002.pngファイルが1-002.pngすでに存在し、名前を変更できないためです。そのため、このエラーを回避するために、2番目のフィールドの前に0を追加しました。


または、@muruが提案したように、グローバル変数の代わりに逆参照を使用することもできます。

rename -n 's/^(\d+)-(\d+)/sprintf("$1-%04d",$2*2)/e' *.png

$1firstの逆参照であり(\d+)$2secondの逆参照です(\d+)(group)グループとしてキャプチャするには、一対の括弧を使用する必要があります。

-n最後に、コマンドからオプションを削除してファイルの名前を変更できます。

おすすめ記事