私の名前はいくつかあります。
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
。
ワイルドカードは、シェルがパターンを取得し、パターンと一致するファイル名のリストに展開するプロセスです。正規表現と混同しないでください。正規表現は異なります。ほとんどの時間を過ごしたら、bash
Wooledge 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 ...
シェルによって生成された拡張コマンドラインが大きすぎる可能性があります。
-delete
Domが提案したように、次のオプションを使用することもできます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でも動作します。