名前と拡張子が不明なファイル名の一括変更

名前と拡張子が不明なファイル名の一括変更

私はたくさんの写真を持っています。一部はあり、.jpg一部はです.png。与えられた画像は完全に任意の名前を持つことができます(スペースを含めることができます)。特定のディレクトリ内で拡張子を変更せずにすべてのディレクトリの名前を変更するにはどうすればよいですか?たとえば、次のようになります。

001.jpg
02.png
05.png
zzzz.jpg

0001で始まり9999(必要な場合)、4桁の数字で名前を完全に変更したいと思います。したがって、出力は次のようになります。

0001.jpg
0002.png
0003.png
0004.jpg

このファイルの順序は私にとって重要ですが、ファイル名で並べ替えると、すでに順に並べ替えられています。

私はPerlをチェックしてみましrenameたが、この例ではPerlの使い方は私にとって謎です。

ベストアンサー1

Perlソリューション

perl -e '
    @files = sort glob "*.png *.jpg";
    for(@files){ 
        ($extension = $_) =~ s/.*\.(.*)/$1/;
        $new_name = sprintf("%04d",++$counter).".$extension";
        die "File $new_name already exists and would be clobbered\n" if -e $new_name;
        rename $_ => sprintf("%04d",++$counter).".$extension"
     }'

カンクンソリューション

export COUNT=0 
find . -maxdepth 1 -name "*.jpg" -o -name "*.png" -print0 | xargs -0 sort | while read file do\
extension=${file##*.}\
COUNT=$((COUNT+1))\
mv -- "$file" $(printf "%04d" $COUNT).$extension\
done

ノート

  • どちらのソリューションもテストされていない Bash ソリューションです。まずダミーファイルで試してみてください。
  • ファイル名に改行文字が含まれていると、Bashソリューションがクラッシュする可能性があります。
  • 危険:Gillesが以下の説明で指摘したように、元のファイルの1つの名前がターゲットの命名規則に従うと、せいぜい別の「数字」に名前が変更され、最悪の場合は他のファイルによって破損します。何が起こるかは、他のファイルに対してどのようにソートされるかによって異なります。 OPが好むようだったので、これをPerlソリューションに追加しました。
  • Perlソリューション(上記の実装)は次のとおりです。非等性

おすすめ記事