特定の文字列を含むすべてのファイル名の拡張子を変更します。

特定の文字列を含むすべてのファイル名の拡張子を変更します。

名前に「x264」という文字列を含むファイルを受け取ったら、拡張子を「.mp4」に変更したいと思います(ここでは説明するにはあまりにも詳細な理由が原因です)。例:

Seinfeld_S02E05_x264.mkv ->Seinfeld_S02E05_x264.mp4

Seinfeld_S02E05_x264.avi ->Seinfeld_S02E05_x264.mp4

これらの変更を自動化するには、どのスクリプトを使用できますか?私のコンピュータはFreeBSD 11.1を実行しているNAS4FREEサーバーです。

更新(Jeffの応答後):指定されたディレクトリとすべてのサブディレクトリでも機能したいという事実に言及するのを忘れました。スクリプトの代わりにコマンドを使用しますか?

答え1

for f in *x264*.*
do
  mv -- "$f" "${f%.*}".mp4
done

上記のコードは、「glob」モードでシェルループを実行して、一部の拡張子の前に「x264」を含むファイルを見つけます(後で拡張子の名前を変更できるように)mv。名前を変更し、パラメータ拡張を使用して拡張子(ピリオドの後に何も付く*)を削除してから、.mp4拡張子を手動で追加します。

答え2

使用find:

find -type f -name "*x264*" -execdir sh -c 'echo mv -n "$1" "${1%.*}.mp4"' _ {} \;

このオプションは、指定されたサンプルファイルの名前が単一のファイル名に変更されるため、既存のファイルを上書きするのを-n防ぎます。この場合、最初のファイルは削除されます。mv

拡張子(サフィックス)を持たないファイルでこれを行うには、次のようにします。

find -type f -name "*x264*" -execdir sh -c 'file="${1#./}"; 
    echo mv -n "$file" "${file%.*}.mp4"' _ {}  \;

上記の項目を削除してechoドライランを削除し、ファイル名を変更してください。

関連情報