共通のプレフィックスとサフィックスを含む複数のファイルを削除する方法は?

共通のプレフィックスとサフィックスを含む複数のファイルを削除する方法は?

私の名前はいくつかあります。

sequence_1_0001.jpg  
sequence_1_0002.jpg  
sequence_1_0003.jpg  
...

とファイル名

sequence_1_0001.hmf  
sequence_1_0002.hmf  
sequence_1_0003.hmf  
...

とファイル名

sequence_2_0001.jpg  
sequence_2_0002.jpg  
sequence_2_0003.jpg  
...

そして

sequence_2_0001.hmf  
sequence_2_0002.hmf  
sequence_2_0003.hmf  
...

「sequence_1」で始まり、「.hmf」で終わるファイルだけを削除したいのですが、何千ものファイルがあるため、1つずつ削除したくありません。プレフィックス「sequence_1」で始まり、「.hmf」で終わるすべてのエントリを削除するrmコマンドをどのように指定しますか?

私は現在RedHat Linuxシステムを使用していますが、他のディストリビューションでもどのように使用しているのかを知りたいです。

答え1

rm sequence_1*.hmf

sequence_1で始まり終わるファイルを削除します.hmf


ワイルドカードは、シェルがパターンを取得し、パターンと一致するファイル名のリストに展開するプロセスです。正規表現と混同しないでください。正規表現は異なります。ほとんどの時間を過ごしたら、bashWooledge Wikiに良い情報があります。ワイルドカードページ(パス名拡張)。最大の移植性が必要な場合は読んでください。パターンマッチングのためのPOSIX仕様そして/代わりに。


もし遭遇する場合「パラメータリストが長すぎます」エラーが発生しました。確認してみてください。バッシュFAQ 95、この問題を解決しました。最も簡単な解決策は、エラーが消えるまでグローバルパターンを複数の小さな塊に分割することです。あなたの場合、次のように、0から9をプレフィックスとして使用して一致を分割できます。

for c in {0..9}; do rm sequence_1_"$c"*.hmf; done
rm sequence_1*.hmf  # catch-all case

答え2

jw013の答えは正しいですが、何千もの一致があるとコマンドが失敗する可能性があります。つまり、rm sequence_1_0001.hmf sequence_1_0002.hmf ...シェルによって生成された拡張コマンドラインが大きすぎる可能性があります。

-deleteDomが提案したように、次のオプションを使用することもできますfind

find . -maxdepth 1 -type f -name 'sequence_1*.hmf' -delete

-maxdepth-deleteはありませんが、両方POSIX規格find野生の実装では非常に一般的です。 Linuxディストリビューションは通常、findこれらのオプションを確実にサポートするGNUを使用します。

答え3

rm sequence_1_{0000..0999}.hmf
rm sequence_1_{1000..1999}.hmf
rm sequence_1_{2000..2999}.hmf
...

Bashでも動作します。

関連情報