次の形式のファイルがあります。
filename1 1 extra1.ext filename1 2.ext filename1 3 extra2.ext ... filename2 1.ext filename2 100 extra3.ext ... filename20 1.ext filename20 15 extra100.ext (etc.)
...wherefilename1
などにはfilename2
スペースと数字、文字、、、および記号を含めることができますが、[
スペース]
内に数字を含めることはできません。 Andなどには何でも含めることができます。ファイル名にスペースで囲まれた数字は繰り返されません。(
)
'
extra1
extra2
filename1
filename2
私が望むのは、それを含むファイルの追加内容を削除することです。つまり、filename20 15 extra100.ext
からfilename20 15.ext
また、ディレクトリ内のコンテンツを繰り返す必要があるため、追加のコンテンツを含むファイルと名前変更方法を適用するファイルを区別する必要があります。
可能ですか?私はWindowsからLinuxに移動し、バッチスクリプトがありますが、bashから始める方法がわかりません。
挨拶、
答え1
(perl) を使用して名前を変更します。コマンドは次のとおりです。
rename 's/( [0-9]*) .*\.ext/$1.ext/' *
Linuxディストリビューションは通常2つのバージョンrename
で利用できます。デフォルト値は通常より単純なバージョンです。 Perlベースの名前変更は正規表現へのアクセスを提供するので、より強力です。後者を使用していることを確認してください。 (配布版について言及していませんが、Archではpackageで提供されていますperl-rename
。)
まずテストしてみてください
ファイルを作成します(最後に追加のファイルを追加しました)。
$ touch 'filename1 1 extra1.ext' 'filename1 2.ext' 'filename1 3 extra2.ext' 'filename2 1.ext' 'filename2 100 extra3.ext' 'filename20 1.ext' 'filename20 15 extra100.ext' 'filename3 1 3 4 .ext'
テストコマンド
$ rename 's/( [0-9]*) .*\.ext/$1.ext/' * -n
filename1 1 extra1.ext -> filename1 1.ext
filename1 3 extra2.ext -> filename1 3.ext
filename20 15 extra100.ext -> filename20 15.ext
filename2 100 extra3.ext -> filename2 100.ext
filename3 1 3 4 .ext -> filename3 1.ext
結果がうまくいったら、「テスト実行」/テストフラグを削除して-n
実際に実行してみてください。
説明する
rename 's/foo/bar/' *
:perl renameは正規表現foo
をで置き換えますbar
。これは*
現在のディレクトリのすべてのファイルに適用されます。また、これを明示的に置き換えて、機能する*.ext
ファイルを制限することもできます。/( [0-9]*) .*\.ext
: 空白、数値文字列、[0-9]*
別の空白が順番に出てくる文字列と一致します。後で再利用できるように、キャプチャグループの最初のスペースと数字を囲みます( [0-9]*)
。次に、.*
拡張子を含むすべての項目を一致させます\.ext
。この正規表現は「貪欲」なので、できるだけ多くの文字を一致させようとします。つまり、extra
ファイル名部分にスペースで囲まれた数字があれば一致します。/$1.ext
この一致する部分を上記のキャプチャグループ($1
スペース、数字、拡張子)に置き換えます.ext
。