web-dev-qa-db-ja.com

端末からファイル名に基づいて特定のファイルを削除する

名前のあるファイルを含むディレクトリがあります

_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_の応答を与えました。

これを行う別の方法はありますか?

13
BillyJean

ループや余分なコマンドは必要ありません Bash Shell Brace Expansion

rm -f rho_{0..200000..5000}.txt

説明{start..end..step}-f存在しないファイルに対するプロンプトを無視します。


追伸安全を確保し、どのファイルが削除されるかを確認するには、最初に次のコマンドでテストを行ってください。

ls -1 rho_{0..200000..5000}.txt
49
αғsнιη

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

プログラミングをしたことがあれば、このフォームはより身近なものになるでしょう。

13
Andy Dalton

パイプの内容が引数であるかのようにプログラムにパイプすることはできません。 stdinを介して送信されます。

この目的でxargを使用する必要があります。

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

しかし、最初にエコーを試して、すべてが意図したとおりであるかどうかを確認できます。

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
12
M4rty

私が間違っている場合は誰かが私を修正しますが、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の倍数であるものすべてに一致させるための同様のトリックはありません。)

9
Nate Eldredge