複数桁のサフィックスを持つ同じ名前のファイルを削除するには、ワイルドカードを使用します。

複数桁のサフィックスを持つ同じ名前のファイルを削除するには、ワイルドカードを使用します。

1から500までのような名前とサフィックスを持つファイルがたくさんあります。 1~250個のファイルのみ削除したいです。ワイルドカードを使用してこれを行う方法はありますか?

ファイルは次のとおりです。stdout.1〜stdout.500

stdout.1からstdout.250までファイルを削除したいです。

ありがとう

答え1

Zshでは、10進整数を表すファイル名部分にrm stdout.<1-250>.matchを実行できます。<n-m>N到着。 (前に0がある可能性があるのでこれもstdout.0099一致します。)

Bashでは中括弧拡張を使用できますrm stdout.{1..250}。しかし、Zshとの違いは、中<1-250>かっこ拡張が既存のファイルに関係なく文字列を生成するため、リストの途中にファイルがないとエラーが発生する可能性があることです。の場合、rmこのオプションを追加するとこれらのエラーが削除されます。これは、リンク解除を要求したファイルが戻ってもまだ存在する場合にのみエラーが発生する-fためです。-frm

存在しないファイルの名前の生成を回避したり、標準sh(中括弧拡張なし)に制限したりするには、文字ごとに一致する必要があります。だから:

rm stdout.? stdout.??       #   1 to  99
rm stdout.1??               # 100 to 199
rm stdout.2[01234]?         # 200 to 249
rm stdout.250               # 250

ただし、一致するファイルがない場合は、呼び出されたファイルが存在する場合はrm stdout.2[01234]?最終的に削除されます。stdout.2[1234]?

答え2

あなたはそれを使用することができます支柱の拡張そのために

rm stdout.{1..500}

コマンドはに展開されますrm stdout.1 stdout.2 ... stdout.500。一部のファイルが存在しない場合はエラーメッセージが表示されますが、無視してもかまいません。あるいは、stderrをリダイレクトして表示されないようにすることもできます。

rm stdout.{1..500} 2>/dev/null

あるいは、はるかに遅くなるため、ファイルを繰り返しrm存在するファイルでのみ実行できます。

for f in stdout.{1..500}; do
    [ -e "$f" ] && rm "$f"
done

stdout.名前が1つ以上の数字で始まり、終わるすべてのファイルを削除することもできます。

rm stdout.[0-9]*

ただし、これは保持したいパターンに一致するファイルがない場合にのみ機能します。みんなファイル表示名は数字で始まり、その後に数字が続くため、範囲外のファイルもstdout.削除されます。stdout.501

関連情報