Linux'da "test" adlı tüm dizinleri bul ve sil


35

"Test" adında birçok dizin var ve bunları kaldırmak istiyorum.

Onları nasıl bulacağımı ve kullanarak nasıl basacağımı biliyorum:

find . -name test -print

Şimdi, dizinleri nasıl kaldırırım?


Lütfen dizinde dosyalarım olduğunu ve bunların da kaldırılması gerektiğini unutmayın.

Yanıtlar:


70

xargs tüm sihir yapar:

find . -name test -type d -print0|xargs -0 rm -r --

xargs parametre olarak iletilen komutu, stdin'e iletilen argümanlarla yürütür.

Bu, rm -rdizini ve tüm alt öğelerini silmek için kullanılır .

--İle başlayan bir yol önlemek için bağımsız değişken ucunu gösterir -, bağımsız değişken olarak tedavi edilmelerini.

-print0yeni satırlar yerine karakter findyazdırmayı söyler \0; ve sadece argüman ayırıcı olarak davranmalarını -0söyler .xargs\0

Bu, bir rmkerede birçok dizinle çağırarak rm, her bir dizin için ayrı olarak arama yapmaktan kaçınıyor .


Alternatif olarak, seçilenfind her dosya için bir komut da çalıştırabilir :

find . -name test -type d -exec rm -r {} \;

Ve arayacak beri daha iyi bir performans bu bir, rmile bir kerede birden fazla dizinleri :

find . -name test -type d -exec rm -r {} +

( +Sonunda not edin ; bu, xargsçözüme eşdeğerdir .)


1
Mükemmel cevap, özellikle de +bulmak. Hiçbir fikrim yoktu, kesinlikle çok uzun zaman önce bilseydim diledi.
Scott

son komutuna dikkat et, bir şekilde bazı dosyaları silmiş. xargsKomut iyi çalıştı.
Henrique de Sousa

23
find /path/to/dir -name "test" -type d -delete
  • -adı: geçirilen adı arar. -regexDüzenli ifadelere dayalı adlar sağlamak için kullanabilirsiniz

  • -type: dosya türlerini arar. dsadece dizinleri arar

  • -delete: bulunan listeyi silen eylem.

Alternatif:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

As JF Sebastian yorumlarda belirtildiği:

Bir seferde birden fazla dizin geçmek +yerine kullanabilirsiniz \;.


1
Üzgünüz, bu dizinlerin dosyalarının olabileceğini söylemeyi unuttum. Bazılarını "bulma:` ./start ': dizini boş değil' hatası silemiyor "hatası nedeniyle silemedim
çöp toplama

@ garbagecollection Bir güncelleme ekledim.
jaypal singh

3
bir kerede birden fazla dizini geçmek +yerine kullanabilirsiniz \;.
jfs

Teşekkürler @ JFSebastian İyi nokta. Cevaba ekleyeceğim.
jaypal singh


5

-Exec seçeneğini de kullanabilirsiniz

find . -name test -exec rm {} \;

3

Bash 4+ varsayımı

shopt -s globstar
rm -r ./**/test/

Sondaki eğik çizgi, yalnızca dizinlerle eşleşeceği anlamına gelir. Test ile önceden yapılır:

printf '%s\n' ./**/test/

2

Gnu find kullandığınızı varsayalım , -delete seçeneğini kullanabilirsiniz:

find . -name test -delete

hatırlanması kolay olan.


2

Başka bir cevabın işaret ettiği gibi , isimleri olan tüm dizinleri bulmayı deneyebilir testve silebilirsiniz.

find -name "test" -type d -delete

Mac'te çapraz uyumlulukla ilgili bazı sorunlarla karşılaştım, bu yüzden bu eşdeğer komutu kullandım:

find -path "*/test" -type d -delete
  • -path : tam olarak nitelenmiş dosya adında bir kalıp arar.

Bununla birlikte, her iki durumda da, adlandırılmış dizinlerden herhangi birinin içinde testdosya varsa , dizinin kaldırılmasından findşikayetçi Directory is not emptyolur ve dizini kaldıramaz.

Dizin dahil tüm dosyaları silmek isterseniz test, o zaman testilk adı verilen dizinlerin içindeki tüm dosyaları silmek için aynı numarayı kullanabiliriz .

find -path "*/test/*" -delete

Pattern:, "*/test/*"yalnızca adlandırılmış bir dizindeki dosyaları silmemizi sağlayacaktır /test/. Dizinler boşalınca, ilk komutu kullanarak devam edip dizinleri silebiliriz:

find -path "*/test" -type d -delete

Örnek:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

2 directories, 1 file
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.