dosyaları ve dizinleri özyinelemeli olarak kaldırmak için rm kullanma


17

diğer komutları kullanmadan bir kalıpla eşleşen dosyaları ve dizinleri özyinelemeli olarak kaldırmak için rm kullanmak mümkün müdür?

Yanıtlar:


35

Sorunuzu doğrudan yanıtlamak için "hayır - tanımladığınız şeyi yapamazsınız rm".

Sen olabilir , ancak, Bunu, birleştirmek bunu find. İşte bunu yapmanın birçok yolundan biri:

 # search for everything in this tree, search for the file pattern, pipe to rm
 find . | grep <pattern> | xargs rm

Örneğin, tüm * ~ dosyaları tıklatmak istiyorsanız, bunu yapabilirsiniz:

 # the $ anchors the grep search to the last character on the line
 find . -type f | grep '~'$ | xargs rm

Bir yorumdan * genişletmek için :

 # this will handle spaces of funky characters in file names
 find -type f -name '*~' -print0 | xargs -0 rm

1
true - son boruyu terk ederseniz, önce her şeyin bir listesini alırsınız :)
warren

2
Posterin sorusuna doğrudan cevap vermeyebilir, ancak istediklerine en yakın olacaklardır.
Drakia

1
Bir Cüce, bu sebepsiz yere biraz acı değil mi?
Gnoupi

10
Lütfen kullanırken çok dikkatli olun find | grep | xargs rm. Boşluklu dosyalar (veya yeni satırlar) varsa, bu kesilir (ve dosya adlarına ve boşlukların bulunduğu yere bağlı olarak) silmek istemediğiniz şeyleri silebilir. find … -print0 | xargs -0 rmçok daha sağlam olacak. Ancak bu, yalnızca istediğiniz dosyaları eşleştirmek ve yazdırmak için 's tahminlerini grepkullanmanız gerektiği anlamına gelir find. warren'in ikinci örneği daha sağlam olacak find -type f -name '*~' -print0 | xargs -0 rm.
Chris Johnsen

1
İşi yapmak için tek bir komut istiyorsanız, verilen find komutlarından birini kullanarak bir diğer ad oluşturun. İsterseniz daha sonra bunun için bir cevap dolduracaktır.
casualuser

8

"diğer komutları kullanmadan"

Hayır.


"İlk soruyu kesin olarak cevaplayın (çözüm sağlayamama riskiyle)" ile "belirtilen kısıtlamalarla tam olarak eşleşmese bile" bir çözüm sağlayın.
Gnoupi

Ben sadece "Bir Cüce" aslında bir çözüm sağlayan cevap şikayetçi olarak yayınlanmıştır. Diğer komutları kullanmadan , bir kalıpla eşleşen özyinelemeli dosya silme işlemini gerçekleştirmenin bir yolu yoktur , sadece geçerli dizin dosyası / dizin silme.
Drakia

3

Bash'i globstarset ile birlikte kullanarak , evet :

rm basedir/**/my*pattern*

Eşleştirdiğiniz dosyaları listelemeden ls -1önce örneğin ilk önce deneyin rm.

Seçenekleri örn shopt -s globstar.


Alternatif olarak, daha kısa bir findvaryant:

find -type f -name 'my*pattern*' -delete

veya GNU için find:

find -type f -name 'my*pattern*' -exec rm {} +

veya GNU olmayanlar için başka bir alternatif find(biraz daha yavaş):

find -type f -name 'my*pattern*' -exec rm {} \;

Ayrıca sormak gibi dizinleri kaldırmak için: sadece değişim rmiçine rm -ryukarıdaki komutları ve yalnızca eşleştirme atlamak -type fiçinde findkomutlar.


0

Ben asuumed "rm -rf" nerede dosya adları ve * ve? vb. (ör. todays_log_2009 ????. log). Bu, geçerli Dir'den başlayacak ve bu kalıbı oluşturan dosyaları yinelemeli olarak kaldıracaktır.


Desen geçerli dizindeki kabuk tarafından genişletildiğinden bu çalışmaz. Alıntılanırsa, desen içinde özel karakterlerin bulunduğu bir dosya adı olur. örneğin dosyayı silmek için [, rm '[' yazılabilir. Desen basitçe anlamını yitirir.
casualuser

0

Eğer kullanırsanız zsh (1) , ile "globbing genişletilmiş" açmak setopt extendedglob.zshrc dosyanızda içinde. Desene '** /' önekinin eklenmesi tekrarlı olarak silinir:

% rm -rf ** / <desen>

Ancak, silinecek çok fazla dosya varsa , xargs (1) veya -exec ile (1) bulmak için başvurmalısınız ve bunu kabuk komut dosyalarında da yapmanızı öneririz.

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.