さまざまな形式(解像度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/' ./*