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
ためです。-f
rm
存在しないファイルの名前の生成を回避したり、標準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