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


13

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

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

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


6
これを行う方法に関係なく、(安全のため)目的のファイルをディレクトリに移動することをお勧めします。削除するファイルのみがディレクトリにあることを確認したら、ディレクトリを削除します。
user117529

ここでは安全が重要です。通常、これらのことをls最初にテストします。
スコットランド

回答:


49

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

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

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


Ps安全を保ち、どのファイルが削除されるかを確認するには、まず次のテストを行ってください:

ls -1 rho_{0..200000..5000}.txt

13

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

プログラミングを行ったことがあれば、このフォームはより馴染みがあるかもしれません。


12

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

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

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

ただし、最初にechoを試して、すべてが意図したとおりかどうかを確認できます。

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

お使いのバージョンでは場合seqあり-f/ --formatあなたの代わりにして、この回避策のそれを使用することができるオプションprintfとコマンド置換を。
デビッドフォースター

私は質問に使用されるコマンドを使用して、彼のRMエラー説明しようと答えました、ありがとう
M4rty

9

私が間違っていれば誰かが私を修正しますが、で始まるすべてのファイルrho_がこの形式である場合、それはdoと同等ではありません

rm rho_0.txt rho_*[05]000.txt

数字(0以外)は、0000または5000で終わる場合にのみ5000の倍数であるためです。

(0は5000の倍数であるため、特殊なケースですが、通常は追加の先行ゼロなしで書き込まれます。0を含めるつもりがない場合は、上記の行から削除してください。)

もちろん、これはrho_*.txtディレクトリ内のすべてのファイルが目的の形式である場合にのみ使用する必要があります。ディレクトリにもが含まれている場合は使用しないでくださいrho_please_dont_delete_me_5000.txt

(数学ノート:これは、5000のすべての素因数、つまり2と5が作業中の基底の素因数であるため、正確に機能します。10。同等に、10(つまり10000)の十分に大きいべき乗があります。 5000で割り切れます。3000の倍数であるものすべてに一致させるための同様のトリックはありません。)


これが実際に最良の答えです。
-cesarv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.