Bir dizindeki tüm boş dizinleri komut satırından nasıl silerim?


58

Diyelim ki bir rehberim var foo/. Bu klasör alt dizinleri içerir. Tüm boş dizinleri tek bir komutta nasıl silebilirim?

Yanıtlar:


119

Bu komutu dene:

find . -empty -type d -delete

findKomut bu durumda, belirtilen yoldan belirli bir arama kriterleri dosyaları / dizinleri için geçerli dizin (dolayısıyla aramak için kullanılır .).

-emptySeçenek boş herhangi bir dosya ve dizin için de geçerlidir.

-type dSeçenek için de geçerlidir dosya belirtilen türün; bu durumda ddosya tipi dizinini ifade eder .

-deleteSeçenek gerçekleştirmek için eylemdir ve aramada bulunan tüm dosyalar için de geçerlidir.


Bence bunu yapmanın en kolay yolu bu yüzden devam edip cevap olarak işaretleyeceğim.
Sadece

Hey Bill, başka bir benzer soru daha göndermeye çalıştım ve bana dupe olduğu için izin vermedi, bu yüzden bana burada cevap verebileceğini umuyordum. Yukarıdaki gibi aynı şeyi yapmak istediğimi söyleyin, ancak boş olsun olmasın tüm dizinleri kaldırın.
justingrif

3
Eğer olursa olsun boş olsun ya da olmasın, dizinleri kaldırmak olacağını yolu aşağıdaki komutu yazın: rm -rf <directory-name>. Bu, dosyaları ve alt dizinleri içeren tüm içeriği ile birlikte dizini de kaldırır. -rSeçenek ise, yinelemeli silmek demektir -fkomut aracı silmeden önce istenmez. Bununla birlikte, bir dizini / dosyayı silmeden önce sorulmasını istiyorsanız, -fseçeneği seçenekle değiştirin -i.
Bill

Peki ya dizinde bazı dosyalar varsa saklamak istedim. Bu yüzden / foo / bar / dizinindeki tüm dizinleri silmek istedim ancak içinde olabilecek dosyaları saklamak istedim.
11:23

2
Bu beslemek için bir boru kullanarak bunu yapmak mümkündür stdouttek bir komut (örneğin bir findiçine) stdin(örn diğerinin rmo / sen istemediğiniz dizinleri silip veya dosyaları silebilir beri), ancak, çok dikkatli olmak silme! Bunun nasıl yapılacağı hakkında daha fazla bilgi maniçin, bu komutların her birinin sayfalarına bakın . Güvenli olmak için, gerçek bir şey denemeden önce bu tür şeyleri her zaman geçici bir dizinde test edin.
Bill

11

Sen yararlanabilirsiniz rmdirboş olmayan dizinleri silmek için komutun reddetmesi ve find -depthopsiyon dizin ağacı aşağıdan yukarıya hareket etmesi:

find . -depth -exec rmdir {} \;  

(ve hataları yoksay), ya da 2>/dev/nullgerçekten görmezden gelmek için ekleme yap .

-depthSeçeneği finddizin ağacının dibinde bularak başlar.

rm -rfDizindeki tüm dosyaları (ve alt dizinlerini ve ...) VE tüm dizinleri ve her şeyi silecektir .


8
rmdir *

Tüm boş dizinleri siler. Boş olmayan her dizin ve dosya için bir hata atar, bu hataların uçbiriminizi karıştırmasını önlemek için

rmdir * 2> /dev/null

Bu, komut dosyası için uygun değildir, çünkü sıfır olmayan bir durum koduyla çıkacaktır ancak çalışır.
the_drow

@ the_drow nasıl uygunsuz hale getirir? Bu arada da kullanabilirsiniz rmdir * 2>/dev/null || true. (
Bulma

Bunu sık sık yapıyorum $HOME. Kötü bir sırıtışla.
Alois Mahdal

Çünkü, bazı dizinler boş değilse arıza rapor eder.
the_drow

bu bulma yönteminden daha mı hızlı? Kimse ikisini karşılaştırdı mı?
Xerus

1
find . -type d -empty -delete -maxdepth 1

Çünkü sadece direk alt dizinlerini silmek istiyorsanız foo/.


0

Python yaklaşımı

$ tree                                                                                                                                                                                  
.
├── empty_dir1
├── empty_dir2
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

Bu böyle çalışır:

  • os.walk()dizin ağacını özyinelemeli olarak yürümek için kullanırız . Her yineleme üzerinde rbiz erişiyorsunuz geçerli klasöre ayarlanır, siçindeki dizinleri listesini içerir rve fbu klasördeki dosyaların listesini içerecektir. Tabii ki fve sboşsa, bunun boş olduğunu biliyoruz r.
  • ilk liste anlama, emptyyukarıda belirtilen değerlendirmeye dayanarak, boş olan tüm dizinlerin bir listesini oluşturmamızı sağlar .
  • İkinci işlev, listedeki her öğe üzerinde map()gerçekleştirmek os.rmdir()için kullanılır empty. Liste anlama alternatif olarak da kullanılabilir.

Bir komut dosyası olarak bu böyle olurdu:

#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
    if not f and not s and r != ".":
        empty.append(r)

for i in empty:
    os.rmdir(i)

sadece sorular için çok karmaşık :(
nurulhudamustaqim

@ nurulhudamustaqim Bakış açısına bağlı. Python'a alışkın olan birçok Linux kullanıcısı için bu aslında çok mütevazidir :) Ve çeşitliliğinin yanı sıra. Modern sistem yönetimi /bin/shsadece bash ile sınırlı değildir ve Python aslında bu ikisinden daha zarif bir dildir
Sergiy Kolodyazhnyy
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.