2017-12-09 11 views
0

私は以下のようにファイル名形式の一連の画像ファイルを用意しています。複製の名前とインクリメント

9407-C-9406-B-038.jpg 
9407-C-9406-B-118.jpg 
9422-AC-012.jpg 
9422-AC-112.jpg 
9422-BD-043.jpg 
9422-BD-Still-001.jpg 
9405_M.jpg 
9792A.jpg 
9792B.jpg 

私の目的に関連する部分は最初の4文字ですが、残りの部分は無関係です。

私は主要な4文字の文字列が保持されるようなファイルの名前を変更したいのですが、拡張子は保持されますが、重複が発生したとき、残りがインクリメントされる: 例:

9422-AC-012.jpg becomes 942200.jpg 
9422-AC-112.jpg becomes 942201.jpg 
9422-BD-043.jpg becomes 942202.jpg 
9422-BD-Still-001.jpg becomes 942203.jpg 
9405_M.jpg becomes 940500.jpg 
9792A.jpg becomes 979200.jpg 
9792B.jpg becomes 979201.jpg 

使用して '名前を変更します。最初の4文字の後に文字列を取り除くことができます。ファイル名のインクリメンタル部分が何千にもなるという結果になります。

rename -n -N 0001 's/(?<=.{4}).*/$N.jpg/' *.jpg

誰もが、最初の4つの文字の後にファイル名を取り除くファイルの名前を変更し、重複が発生した場合にのみインクリメントする方法を提案することはできますか?

+0

[私の質問に答える?](http://stackoverflow.com/help/someone-answers) – Cyrus

答えて

0

awkレスキュー!

$ while read f t; 
    do 
    echo "mv $f $t"; 
    done < <(awk -F\. '{k=substr($0,1,4); printf "%s\t%s%04d.%s\n", $0,k,a[k]++,$NF}' file) 

mv 9407-C-9406-B-038.jpg 94070000.jpg 
mv 9407-C-9406-B-118.jpg 94070001.jpg 
mv 9422-AC-012.jpg 94220000.jpg 
mv 9422-AC-112.jpg 94220001.jpg 
mv 9422-BD-043.jpg 94220002.jpg 
mv 9422-BD-Still-001.jpg 94220003.jpg 
mv 9405_M.jpg 94050000.jpg 
mv 9792A.jpg 97920000.jpg 
mv 9792B.jpg 97920001.jpg 

は、実際の名前の変更のためechoを削除したファイルに記述されているファイル名で

は、少なくとも4文字の長、ファイル名に何のホワイトスペースを負いませんし、拡張子を持っています。

この例では2桁のカウンタが表示されていますが、数千になるようにカウンタを指定しました。ここでは印刷形式%04dによって制御されますが、100を超えると予想されない場合は4に変更されます。一意のファイルですが、割り当てられた桁数から拡張することができます(たとえば、00,01、.. 99を生成し、次のものは100になります)。

関連する問題