"Bul" un arama yaptığı klasörü hariç tutmasını nasıl sağlayabilirim?


18

Aşağıdaki komutu çalıştırıyorum:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

processingKlasörün altındaki tüm klasörleri silmek istiyorum (işleme klasörü asla silinmemelidir).

Komut processingklasörü de siler. Komut dosyasını yalnızca bu klasörün altındaki klasörleri silmek için nasıl sınırlayabilirim ?


Yanıtlar:


33

En kolay yolu sadece eklemek olacaktır -mindepth 1, hangi ilk derinlik hiyerarşi atlamak ve böylece üst dizini dışarıda bırakın.

Ayrıca, fazladan bir -execaramaya ihtiyacınız yoktur rm, yalnızca deleteklasörleri boşsa doğrudan yapabilirsiniz.

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

Boş değilse:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

Tembelseniz, genişletilmiş bir joker karakter de olabilir. Yana *(varsayılan olarak geçerli dizin içermez sürece dotglobayarlanır ), ayrıca yapabilirdi:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

Ancak, yine dotglobseçenek nedeniyle gizli klasörler de içermez .


Merhaba, "find: warning: uyarı: seçenek olmayan bir argüman -type sonra -mindepth seçeneğini belirttiniz, ancak seçenekler konumsal değil (-mindepth kendisinden önce belirtilen testleri ve sonra belirtilenleri etkiler). Lütfen seçenekleri belirtin ve "find: silinemez` / folder / 50d82faf0e09e ': Dizin boş değil "
Elad Dotan

Yazmadan önce mindepth ekleyin. Boş olmadığında dizinleri silmek için başlangıçta sahip olduğunuz rm yaklaşımına sadık kalabilirsiniz.
slhck

4

Sorun şu ki find, diğer dizinlerle birlikte geçerli dizini (.) Döndürür, bu nedenle işlem klasörünü ve alt dizinleri siler. Bunu atlatmanın hızlı bir yolu seçeneği eklemek olacaktır

-not -name .

bulmayı geçerli dizinin çıktısını almayı durdurur ve ardından dizinin silinmesini durdurur.

Mutlak bir yol kullandığınızdan emin olmak için, komutu işlem dizini içinde çalıştırıyorsanız bu işe yarar:

-not -name /var/www/html/content/processing

Ve tüm komut şöyledir:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;

Son komut yanlış. -nametaban adı anlamına gelir, asla eğik çizgi ile hiçbir şey eşleşmez. Muhtemelen kullanmanız gerekir -path.
Kamil Maciorowski

1

Zaten cevap verdi, yine de başka bir yaklaşım listelemek istiyorum.

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

Bu, üst dizini (ve ayrıca alt dizinleri) hariç tutacaktır ve şimdi üzerine uygulamak istediğimiz komutu uygulayabilirsiniz.

>> Seçenekler:
-mindepth 1: Kök dizinini hariç tutmak için
-maxdepth 1: Alt dizinleri ayrıştırmaktan kaçınmak için. (Sorgulanan özel senaryo için buna ihtiyacınız yoktur).
-type d: Yalnızca dizin türlerini listeler. Bu seçenek mindepth maxdepth kullandıktan sonra gelmelidir.


Neden -maxdepth 1? Neden -type diki kere? Bunun kabul edilen cevaptan farkı nedir?
Attie

@Attie: Teşekkürler, hatayı düzeltti. maxdepth gerekli değildir, ancak alt dizinleri listelemekten kaçınmak yararlı olacaktır.
prashant
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.