Düzenli ifadeyle dosyaları sil


Yanıtlar:


56

Kriterlerinize uyan tüm dosyaları silmek için aşağıdaki komutu kullanabilirsiniz:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

Nasıl çalışır:

  1. ls tüm dosyaları listeler (sonuç yayınlandığından satır satır sıralanır).

  2. grep -P "^A.*[0-9]{2}$" dosyaların listesini filtreler ve yalnızca normal ifadeyle eşleşen dosyaları bırakır ^A.*[0-9]{2}$

    • .*oluşunda herhangi bir sayıda gösterir ., .bir joker eşleme daha karakterdir.

    • [0-9]{2}tam olarak iki [0-9]sayı olduğunu gösterir , yani herhangi bir rakam

  3. xargs -d"\n" rmona aktarılan rm lineher kişi için bir kez çalıştırır line.

Ben nerde hatalıyım?

Yeni başlayanlar için, rmnormal bir ifadeyi argüman olarak kabul etmiyor. Jokerin yanı sıra, *diğer tüm karakterlere kelimenin tam anlamıyla davranılır.

Ayrıca, normal ifadeniz biraz kapalı. Örneğin, *tüm örneklerini anlamına ...normal ifadede, bu yüzden A*maçlar A, AAvb ve hatta boş bir dize.

Daha fazla bilgi için Regular-Expressions.info adresini ziyaret edin .


3
Dosya adlarındaki boşluklara dikkat edin.
slhck

1
-d"\nAnahtar alanları sorununu giderir.
Frg

1
Not - Bazı dağıtımlarda (Mac OS gibi) bir grep -P(Perl regex) yoktur. grep -Ebu durumda çalışabilir.
bluescrubbie

1
Ben kullanmayı tercih -Iile xargsilk öldürücü olmayan komutlarıyla daima testi:xargs -d"\n" -I {} echo "{}"
jozxyqk

1
Ayrıştırma ls? Bkz bu soruyu işaret bu makalede . Tuzaklar yüzünden rmistemediğin şeyi yapabilirsin.
Kamil Maciorowski

45

Veya kullanarak find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

Bu çözüm garip dosya isimleri ile ilgilenecektir .


4
Bu harika bir çözüm. Bunu tercih ediyorum çünkü daha basit ve sonunda regex'inizin dosyalarınızı silmeden önce doğru olup olmadığını görmek için önce -delete bayrağını atlayabilirsiniz.
JAMESSTONEco

1
Ayrıca, örnek eklemek için, silmek ne fazla kontrole sahip-type f
Marco Sulla

Bu dosya ve klasörleri silmek için kullanılabilir mi? Boş olmayan klasörler için çalışmaz.
Alex

@Alex hayır, dizin boş olmalıdır (yine de bir OP gereksinimi değildi), xargsyaklaşımını kullanabilirsiniz rm -f.
cYrus 9:17


1

Regexp ile olan çözüm 200 kat daha iyidir, hatta komutu kullanmadan önce hangi dosyanın silineceğini görseniz bile, son boruyu kesin:

ls | grep -P "^A.*[0-9]{2}$"

O zaman doğru ise, sadece kullanın:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

Bu 200 kat daha iyidir çünkü Unix ile çalışıyorsanız, grep'in nasıl kullanılacağını bilmek önemlidir. Nasıl kullanılacağını biliyorsanız çok güçlü.


1
Bu Dennis'in 4 yaşındaki cevabının zaten söylediklerinin çok ötesine geçmiyor gibi görünüyor .
Saat

1
"200 kez" oldukça belirgindir. Diğer birçok komut da çok güçlü, tek yapmanız gereken onları nasıl kullanacağınızı öğrenmek.
Glenn jackman

1

Bu benim mac üzerinde çalışır:

rm $(ls | grep -e '^A*[0..9]2$')


0

find komut regexes ile de çalışır.

Hangi dosyaların silineceğini kontrol edin

find . -regex '^A.*[0-9]{2}$'

Dosyaları sil

find . -regex '^A.*[0-9]{2}$' -delete
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.