固定長に名前を変更する方法

固定長に名前を変更する方法

0-n.jpgたとえば、1〜500という名前のファイルがあります。n

問題は、Windowsを使用している一部の人が前にゼロを使用しないことですls

0-100.jpg
0-101.jpg
...
0-10.jpg
...
0-199.jpg
0-19.jpg
0-1.jpg

lsそのため、結果が次のようになるように前にゼロを挿入するように名前を変更したいと思います。

0-001.jpg
0-002.jpg
...
0-100.jpg
...
0-499.jpg
0-500.jpg

つまり、すべてのファイルが同じファイル名の長さを持つことを望んでいます。

頑張ったこのソリューションただし、次の一連のエラーが発生します。

bash: printf: 0-99: invalid number

答え1

システムにPerlベースのrenameコマンドがある場合は、次のことができます。

rename -- 's/(\d+)-(\d+)/sprintf("%d-%03d",$1,$2)/e' *.jpg

-v(verbose)および(no action)オプションを使用して-nテストします。

$ rename -vn -- 's/(\d+)-(\d+)/sprintf("%d-%03d",$1,$2)/e' *.jpg
0-10.jpg renamed as 0-010.jpg
0-19.jpg renamed as 0-019.jpg
0-1.jpg renamed as 0-001.jpg

答え2

zshシェルがある場合は、次のことができます。

zmv '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'

テスト

touch 0-1.jpg
touch 0-23.jpg
touch 0-345.jpg
touch 0-6.jpg
touch 0-05.jpg

シェルをに変更します。ロードされていないzsh場合はこれを行うことができます。zmvautoload zmv

-nコマンドにフラグを追加して、コマンドを実行したときに何が起こるかを確認zmvできます。zmvコマンドを実行しています。

zmv -n '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'

出力は、

zmv -n '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'
mv -- 0-05.jpg 0-005.jpg
mv -- 0-1.jpg 0-001.jpg
mv -- 0-23.jpg 0-023.jpg
mv -- 0-6.jpg 0-006.jpg

ファイル名が正しく変更された場合は、フラグを削除できます-n

引用する

この問題の疑いを明確にしてくれたユーザーGnoucに感謝します。このソリューションを入手するための別の質問として投稿しました。Gnoucの回答へのリンクは次のとおりです。これ一つ。

答え3

「名前の変更:」がない場合の別の回避策

for file in *.jpg; do
   [ -f "$file" ] || continue  #skips if no jpg file present in current dir
   echo "${file}" | awk -F'[-.]' '
      {   new=sprintf("%03d",$2); 
          print "echo TESTING mv ", $0," ",$1"-"new"."$3 
      }'
done | bash

(編集:| bashファイルごとに1回ではなく1回だけ呼び出されるように移動しました。そして、このクイックループは「奇妙なファイル名」には適していませんが、さらにクリーンアップできます(スペースを含むファイルを処理するためなど)。

必要な作業が行われていると確信している場合は、その2つの単語を削除してecho TESTING実際に実行してください。mv ...

答え4

別のアプローチがあります。ファイルの特定のサブセットの名前を変更するだけで、そのファイルが何であるかを既に知っているので、そのファイルをリストして名前を変更してください。

for i in {1..99}; do mv -- 0-$i.jpg 0-$(printf '%03d\n' $i).jpg; done

これにより、1から99までの数字がリストされ、各値はすでに$i正しく名前が付けられているため、残りの値は気にする必要はありません。その後、0-$i.jpg塗りつぶされたバージョンに名前を変更できます。長さが3文字未満の場合、このprintf %03dコマンドは左側にゼロが追加された数字を印刷します。その結果、問題のあるすべてのファイルの名前が変更されます。

関連情報