名前の一部を削除するには、正規表現を使用してファイルの名前を変更します。

名前の一部を削除するには、正規表現を使用してファイルの名前を変更します。

Linuxシステムで処理する必要があるファイルがたくさんあります。ファイルは次のようになります。

2009-08-18T034353_DR1_4N-NAC_123456_1234_band1.ntf          
2009-08-18T034353_DR1_4N-NAC_123456_1234_browse.jpg    
2009-08-18T034353_DR1_4N-NAC_123456_1234_band2.ntf    
2009-08-18T034353_DR1_4N-NAC_123456_1234_license.txt    
2009-08-18T034353_DR1_4N-NAC_123456_1234_metadata.xml     
2009-08-18T034353_DR1_4N-NAC_123456_1234_readme.txt      
2009-08-18T034353_DR1_4N-NAC_123456_1234_udm.tif

この部分を取り除きたいです。-NAC_123456_1234最初の部分は英数字で構成でき、数値部分は数字のみで構成できます。

名前変更コマンドを試しましたが、機能しませんでした。私は次のようなことを考えました。

rename '/-[a-zA-Z]+_[0-9]+_[0-9]+//' *.*

私が何を見逃しているのかを調べるのに役立つ人はいますか?

私の名前が変更されたバージョンは次のとおりです。

rename from util-linux 2.23.2

ベストアンサー1

使用したい構文はPerlrenameコマンド用です。オペレーティングシステムによっては、このオプションをprename使用することもインストールすることもできますが、perl-renameこのオプションが必要です。いいえfromは試行中の正規表現構文をrename使用します。util-linuxそしてこれにもかかわらず、少し違うものが必要です。

perl-rename 's/-[a-zA-Z]+_[0-9]+_[0-9]+//' *.*

実際に欲しいのは、最後の項目以降のすべての項目を削除することです-

perl-rename 's/(.*)-(.*)(\.*)/$1$2/' *.*

ただし、このツールを使用する必要はありません。小さなシェルループを実行できます。

for file in *; do
    ext="${file##*.}"
    newName="${file%-*}.$ext"
    echo mv -- "$file" "$newName"
done

これは実行されるコマンドのみを印刷します。満足したら、正しい場合は削除してecho再度実行して、実際に名前を変更してください。

説明する

  • for file in *:現在のディレクトリ内のすべてのファイル(およびディレクトリ)を繰り返して、各ファイルを$file
  • ext="${file##*.}": 構文は${variable##pattern}先頭から最長の一致を削除します。したがって、ここではファイル拡張子を残し、最後のファイルまですべてを削除します。pattern$variable.
  • newName="${file%-*}.$ext"${variable%pattern}: 構文が の末尾から削除する最も短い一致です。だからここでは最後まですべてを私たちに任せます。次に、拡張子を追加して新しいファイル名を指定します。pattern$variable-
  • mv -- "$file" "$newName":ファイル名を変更します。

おすすめ記事