ファイル名の複数の部分文字列を1つ(bashまたはzsh)に置き換えます。

ファイル名の複数の部分文字列を1つ(bashまたはzsh)に置き換えます。

さまざまな形式(解像度4k、4K、2160、XXYなど)の情報を含むファイル名を持つテキストファイルがありますが、ファイル名を一貫した単一形式に変更したいと思います。

1つのパターンのみを実行するときは、次のようにしましたが(スクリプトから抜粋)、複数の部分文字列(OR演算子)を含む正規表現形式を含めるように行を調整または変更する方法はありますか?ライン3ファッション。

line1: findhighresmarker=".4k."
line2: replaceWith=".2k."
line3: newFileName2K=${file//$findhighresmarker/$replaceWith}

もちろん、代替ソリューションも同様に歓迎され、高く評価されます。事前にありがとう

答え1

正規表現を使用してファイル名を変更するには、perlrenameユーティリティを使用します。 OS/ディストリビューションによっては、、、または同様の名前でrename呼ばれるprenameことがperl-renameありますfile-rename

これはいいえrenameのユーティリティと同じで、util-linuxまったく異なる機能と互換性のないコマンドラインオプションを備えたまったく異なるプログラムです。

インストールしたことを確認するには、オプションで上記のコマンド名の1つ以上を実行します-V。 Perlの名前を変更するには、「perl」または「File :: Rename」があります。util-linuxバージョンの場合はこれを参照してください。 Linuxシステムに両方をインストールすることはまれではありません。たとえば、util-linuxのバージョンはrenameまたはrename.ul、perlのバージョンはprenameまたはですfile-rename

たとえば、Debian では以下をすべてインストールしました。

$ rename.ul -V
rename.ul from util-linux 2.38.1

$ rename -V
/usr/bin/rename using File::Rename version 2.01

とにかく提案したパターンの名前を変更するには、次のように使用できます。

rename -n 's/resolution 4k|3840x2160|2160/4k/' ./*

この-nオプションを使用すると、名前を変更するのではなく、名前を変更したものだけを印刷します。必要に応じて動作すると確信したら、-nそれを削除するか、-v詳細な出力に置き換えてください。

セミコロン文字で区切って、必要に応じて変更操作を追加し、s///各ファイル名に順番に適用します。実際には、renameスクリプトで有効なPerlコードを使用できます(変数の範囲に注意を払う限り、変数とサブルーチンも同じです。strictモードで実行されます)。たとえば、ファイル名を確認し、一致するパターンに基づいて変数を設定し、設定した変数に基づいてまったく新しいファイル名を構成する名前変更スクリプトを作成できます。

sed簡単な交換操作のみを使用している場合は、ファイル名のように考えることができます。

例えば

rename -n 's/resolution 4k|3840x2160|2160[pi]?/4k/;
           s/resolution 2k|2560x1440|1440[pi]?/2k/;
           s/1920x1080|1080[pi]?/HD/;
           s/720x480|480[pi]|4:3/SD/' ./*

関連情報