名前のあるファイルを含むディレクトリがあります
_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
_の応答を与えました。
これを行う別の方法はありますか?
ループや余分なコマンドは必要ありません Bash Shell Brace Expansion
。
rm -f rho_{0..200000..5000}.txt
説明:{start..end..step}
。 -f
存在しないファイルに対するプロンプトを無視します。
追伸安全を確保し、どのファイルが削除されるかを確認するには、最初に次のコマンドでテストを行ってください。
ls -1 rho_{0..200000..5000}.txt
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
プログラミングをしたことがあれば、このフォームはより身近なものになるでしょう。
パイプの内容が引数であるかのようにプログラムにパイプすることはできません。 stdinを介して送信されます。
この目的でxargを使用する必要があります。
printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm
しかし、最初にエコーを試して、すべてが意図したとおりであるかどうかを確認できます。
printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
私が間違っている場合は誰かが私を修正しますが、rho_
で始まるすべてのファイルがこの形式である場合、それは行うことと同等ではありません
rm rho_0.txt rho_*[05]000.txt
数字(0以外)は5000の倍数なので、0000または5000で終わる場合に限ります。
(0は5000の倍数であるため、特殊なケースですが、通常は追加の先行ゼロなしで書き込まれます。0を含めるつもりがなかった場合は、上記の行から削除してください。)
もちろん、これは、ディレクトリ内のすべてのrho_*.txt
ファイルが目的の形式である場合にのみ使用してください。ディレクトリにrho_please_dont_delete_me_5000.txt
も含まれている場合は使用しないでください。
(数学の注意:5000のすべての素因数、つまり2と5は、私たちが作業しているベースの素因数10でもあるので、これは正確に機能します。10同様に、10の十分に大きな力(つまり10000) 5000で割り切れる。3000の倍数であるものすべてに一致させるための同様のトリックはありません。)