次の名前のファイルを含むディレクトリがあります。
rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt
など。 5000の倍数であるすべてのアイテムを削除したいです。
私は次のことを試しましたがprintf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rm
、これは私に答えを与えましたrm: missing operand
。
別の方法がありますか?
答え1
ループや追加のコマンドは必要ありません。Bash Shell Brace Expansion
。
rm -f rho_{0..200000..5000}.txt
説明する:{start..end..step}
。-f
ファイルが存在しないという通知を無視してください。
Psの安全のためにどのファイルが削除されるかを確認するには、まずテストしてみてください。
ls -1 rho_{0..200000..5000}.txt
答え2
rm
標準入力からは読まないでください。次のことができます。
for i in $(seq 5000 5000 25000); do
rm -i rho_${i}.txt
done
動作を確認できるように、削除する前にメッセージを表示する-i
オプションを提供しました。rm
必要に応じて動作することを確認したら、このオプションを無視してもかまいません。
編集:または次のことができます。
for ((i = 5000; i <= 25000; i += 5000)); do
rm -i rho_${i}.txt
done
プログラミングをしたことがある場合は、この形式に慣れている可能性があります。
答え3
パイプの内容がパラメーターであるかのようにプログラムにパイプすることはできません。標準入力で送信されます。
この目的のためにxargを使用する必要があります:
printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm
しかし、まずechoを使用して、すべてが期待どおりに進行していることを確認できます。
printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
答え4
私が間違っていると誰かが私を修正してくれますが、で始まるすべてのファイルがこのrho_
形式であれば、それは次のことと同じではありません。
rm rho_0.txt rho_*[05]000.txt
ゼロ以外の数字は、0000または5000で終わる場合にのみ5000の倍数であるためです。
(0は5000の倍数であるため、特別な場合ですが、通常は0が前に表示されません。0を含めない場合は上の行から削除してください。)
もちろんrho_*.txt
、この方法は、ディレクトリ内のすべてのファイルが必要な形式を持っている場合にのみ使用する必要があります。ディレクトリにもrho_please_dont_delete_me_5000.txt
。
(数学注:これは5000のすべての小引数、つまり2と5が私たちが使用する下数10の小引数であるため、正確に機能します。同様に、10の十分な大きな二乗(たとえば10000)があります。5000まで。3000のすべての倍数を一致させる同様のトリックはありません。)