Terminalden dosya adına göre belirli dosyaları silme


13

İsimli dosyaları içeren bir dizinim var

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

ve bunun gibi. 5000'in katları olanları silmek istiyorum.

Aşağıdakileri denedim:, printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rmama bu bana cevap verdi rm: missing operand.

Bunu yapmanın başka bir yolu var mı?


6
Bunu nasıl yaptığınıza bakılmaksızın, (güvenlik için) istenen dosyaları bir dizine taşımanızı, ardından silinecek tüm dosyaların dizinde olduğunu doğruladığınızda, dizini silin.
user117529

Güvenlik burada önemlidir. Bunları genellikle lsilk önce test ediyorum .
Scot

Yanıtlar:


49

Bulunduğunuz yerde bir döngüye veya ekstra komutlara ihtiyacınız yoktur Bash Shell Brace Expansion.

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

Açıklama : {start..end..step}. -fVarolmayan dosyalar üzerinde istemi görmezden.


Not Güvenliği korumak ve hangi dosyaların silineceğini kontrol etmek için lütfen önce aşağıdakileri içeren bir test yapın:

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

13

rmstandart girdiden okunmuyor. Şunları yapabilirsiniz:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

Ben dahil -iseçeneği rmdavranışını doğrulamak böylece istemi önce kaldırılması. İstediğinizi yaptığından emin olduktan sonra, bu seçeneği atlayabilirsiniz.

Düzenleme: Alternatif olarak şunları yapabilirsiniz:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

Herhangi bir programlama yaptıysanız bu form daha tanıdık olabilir.


12

Bir programa, kanalın içeriği bağımsız değişkenler gibi davranamazsınız. Stdin aracılığıyla gönderilir.

Bu amaçla xarg kullanmalısınız:

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

ama önce her şeyin istediğiniz gibi olup olmadığını görmek için echo ile deneyebilirsiniz:

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

Sürümünüz / seçeneğine seqsahipse, bu geçici çözüm ve komut değiştirme yerine bunu kullanabilirsiniz . -f--formatprintf
David Foerster

Teşekkürler, soruda kullanılan komutu kullanarak cevap verdim ve onun rm hatasını açıklamaya çalışıyorum
M4rty

9

Birisi beni yanılıyorsam düzeltir, ancak ile başlayan tüm dosyalar rho_bu formdaysa, bunu yapmak eşdeğer değil mi?

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

Bir sayı (0 dışında) yalnızca 0000 veya 5000 ile bitiyorsa 5000'in katıdır.

(0 özel bir durumdur, çünkü 5000'in katlarıdır, ancak genellikle ek baştaki sıfırlar olmadan yazılmıştır. 0'ı eklemeyi düşünmediyseniz, yukarıdaki satırdan çıkarın.)

Tabii ki bu sadece rho_*.txtdizininizdeki tüm dosyalar istenen forma sahipse kullanılmalıdır . Dizininiz de içeriyorsa kullanmayın rho_please_dont_delete_me_5000.txt.

(Matematik notu: Bu tam olarak çalışır, çünkü 5000'in tüm asal faktörleri, yani 2 ve 5, aynı zamanda içinde çalıştığımız tabanın asal faktörleridir. 10). 3000'in katları olanlarla eşleşmek için benzer bir hile yoktur.)


Aslında en iyi cevap bu.
cesarv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.