Belirli bir ada sahip klasörler nasıl kaldırılır


139

Linux'ta, bir klasör hiyerarşisinin derinliklerinde iç içe geçmiş belirli bir ada sahip klasörleri nasıl kaldırırım?

Aşağıdaki yollar bir klasörün altında ve isimli tüm klasörleri kaldırmak istiyorum a.

1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b

Ana klasörden hangi Linux komutunu kullanmalıyım?


Belki de noktayı kaçırıyor ama belki birine yardımcı oluyor: Bir ana klasörde 410 klasörüm var - 410'un her birinde iki alt klasör var. Tüm ilk alt klasörler 'final' olarak adlandırılır ve düzenlenmiş pdf'leri ve bir Word içerik listesini içerir. Tif_pdf_various_names adlı tüm ikinci alt klasörler, orijinal olarak taranmış tiff dosyalarını (bazıları 200 sayfaya kadar), bunların düzenlenmemiş pdf'lerini ve taslak .docx içerik listesini - dolayısıyla bir ev çalışması koleksiyonunu içerir. Sadece son olarak düzenlenmiş materyali içeren 410 klasörün bir koleksiyonunu yapmam gerekiyordu - 4 TB'a yakın tiff'lerle. Bulunan en kolay yöntem kullanmaktı (
Micr

Yanıtlar:


156

Hedef dizin boşsa, bul, yalnızca dizinlerle filtreleyin, ada göre filtreleyin, rmdir komutunu çalıştırın:

find . -type d -name a -exec rmdir {} \;

Özyinelemeli içeriğini silmek istiyorsanız, yerine -exec rmdir {} \;göre -deleteya -prune -exec rm -rf {} \;. Diğer cevaplar, bu sürümler hakkındaki ayrıntıları içerir, onları da belirtin.


9
Lütfen ne yaptığını açıklar {} \;mısınız?
winklerrr

6
{}"eşleşen her dosya / klasör için" olarak okunabilir - yani, "bulunan" her dosya / klasörün yerine geçer. cümle \;için bir sonlandırıcıdır -exec.
wmorrison365

2
Bu, dizin boş olmadığında bana "silinemiyor" hatası veriyor
gözü kapalı

1
-prune@David Grayson önerisine göre yanıta bayrak eklemeyi düşünün . Bu olmadan, findhalen eksik olan klasörü ziyaret etmeye çalışacak ve sonunda bir Docker yapısında başarısız olabilecek bir hata koduyla çıkacaktır.
Czyzby

160

"A" adı için bul'u kullanın ve aşağıdaki gibi, isteklerinize göre adlandırılmışları kaldırmak için rm'yi çalıştırın:

find . -name a -exec rm -rf {} \;

Listelemek için önce ls kullanarak test edin:

find . -name a -exec ls {} \;

Bunun yalnızca dizinleri kaldırmasını ve düz dosyaları kaldırmamasını sağlamak için, "-type d" argümanını kullanın (yorumlarda önerildiği gibi):

find . -name a -type d -exec rm -rf {} \;

"{}", Bulunan her dosya "a" için bir ikamedir - exec komutu her birine karşı ikame ile çalıştırılır.


4
Muhtemelen bir dosya aynı isimle eşleşirse oraya bir "-tip d" ​​eklemek istersiniz.
Mark Loeser

3
Ayrıca 1/2/a/3/4bunun, kasıtlı olmayabilecek gibi bir şeyi yakalayacağına dikkat edin, bu nedenle ilk önce test etme önerisi için +1 ...
twalberg

9
echo {}yerine önce test etmek için recols {}
Charney Kaye

2
İşte benim node_modules/.
saruftw

6
Kullandım find . -name a -type d -exec rm -rf {} \;ve işe yaradı, ancak find: ‘./subdir/subdir/a’: No such file or directorysilinen her dizin için yazdırıldı .
pacoverflow

59

Bu da işe yarar - "a" adlı tüm klasörleri ve içeriklerini kaldırır:

rm -rf `find -type d -name a`

@Buffalo, nasıl olur? Bu defo çalışıyor ama diğerleri de çalışıyor. Bunun işe yaradığı bir ortam bulmak şaşırır ama diğerlerine tüm cevapları verilmez aslında find/rm.
wmorrison365

4
@ wmorrison365 çünkü eğer yaparsanız find . -name a -exec rm -rf {} \;, daha fazla öğe aramak için o dizine girmeye çalıştığında bul kilitlenir ve size gibi bir hata verir find: '1/2/3/a': No such file or directory.
Alex Grönholm

@Alex Grönholm elbette, ancak 'a' adlı tüm klasörler yine de siliniyor. Belirttiğiniz gibi, daha sonra silinmiş bir 'a' klasörünün içine bakamaz, ancak bu önemli değil. Silmeden önce sonraki işlemler için 'a' içeriğini saklamayı istemek, OP'nin sorduğundan farklı bir kullanım durumudur.
wmorrison365

6
@ wmorrison365 Evet, dizinler silindi, ancak komutun başarısız olduğu (sıfırdan farklı bir çıkış kodu döndürdüğü) bir çözüm önermenin iyi olacağını düşünmüyorum.
Alex Grönholm

1
Bu bana bir hata veriyordu illegal option --t. Ben de (arama dizini geçmek zorunda stackoverflow.com/questions/25840713/... ): rm -rf `find . -type d -name a`.
Steve Harrison

25

Ada sahip tüm dizinleri silmek için şunu fooçalıştırın:

find -type d -name foo -a -prune -exec rm -rf {} \;

Diğer cevaplarda önemli bir şey eksik: -pruneseçenek. Olmazsa -prune, GNU find, eşleşen ada sahip dizini siler ve ardından eşleşen daha fazla dizin bulmak için içinde yinelenmeye çalışır. -pruneOpsiyon eşleştiği koşullar bir dizine özyineleme onu söyler.


21

node_modulesKullanmakta olan çalışmamın bir yedeklemesini yapmadan önce klasörlerimi silmek için buraya baktım rsync. Temel gerekliliklerden biri, node_modulesklasörün iç içe geçirilebilmesidir, bu nedenle -pruneseçeneğe ihtiyacınız vardır .

Önce, silinecek klasörleri görsel olarak doğrulamak için bunu çalıştırdım:

find -type d -name node_modules -prune

Sonra hepsini silmek için bunu çalıştırdım:

find -type d -name node_modules -prune -exec rm -rf {} \;

Fıstık sayesinde


Ahh bu güzel çalıştı, bunu kolaylıkla kullanabileceğiniz bir şey yapmak için bunu küçük bir kabuk sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
senaryosu

11
find ./ -name "FOLDERNAME" | xargs rm -Rf

Hile yapmalı. Yanlışlıkla bir şişirirsen, UYARI .veya /içine xargs rm -Rftüm bilgisayar bir OS yeniden yükleme gerektiren geri almak için bir seçenek olmadan silinecektir.


2
Oh, sadece o küçücük risk. Hepsi bu? Haha. Uyarı için çok teşekkürler. Kesinlikle bu yazım hatasını yapardım.
TinkerTenorSoftwareGuy

9

100'den fazla dosyam vardı

log-12
log-123
log-34
....

yukarıdaki cevaplar benim için işe yaramadı

ama aşağıdaki komut bana yardımcı oldu.

find . -name "log-*" -exec rm  -rf {} \;

verdim -type, .böylece hem dosyaları hem de klasörleri siler.log-

ve rm -rf siler klasörleri yinelemeli bile dosyaları vardır.

yalnız klasörler istiyorsan

find -type d -name "log-*" -exec rm  -rf {} \;

yalnız dosyalar

find -type f -name "log-*" -exec rm  -rf {} \;

8

Birden fazla yanıtı birleştiren, işte hem Linux hem de MacOS'ta çalışan bir komut

rm -rf $(find . -type d -name __pycache__)

Benim için çalışan ve aynı zamanda hata
vermeyen tek kişi

7

Bir diğeri:

"-exec rm -rf {} \;" can be replaced by "-delete"

find -type d -name __pycache__ -delete      # GNU find
find . -type d -name __pycache__ -delete    # POSIX find (e.g. Mac OS X)

3
Bu cevap yalnızca boş klasörler için geçerlidir. -deleteboş olmayan klasörleri kaldırmaz.
maninak

OSX sürümünü eklediğiniz için teşekkürler
schu34

7

Bu komut benim için çalışıyor. İşini yinelemeli olarak yapar

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

. - geçerli klasör

"node_modules" - klasör adı


-2

/ klasörlerine / dizin yolunu bul -maxdepth 1 -name "my_ *" -type d -sil

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.