ファイル名の変更、ファイル名 bash スクリプトの一部の削除

ファイル名の変更、ファイル名 bash スクリプトの一部の削除

次の形式のファイルがあります。

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などには何でも含めることができます。ファイル名にスペースで囲まれた数字は繰り返されません。()'extra1extra2filename1filename2

私が望むのは、それを含むファイルの追加内容を削除することです。つまり、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

関連情報