Diyelim ki bir rehberim var foo/
. Bu klasör alt dizinleri içerir. Tüm boş dizinleri tek bir komutta nasıl silebilirim?
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:
Bu komutu dene:
find . -empty -type d -delete
find
Komut bu durumda, belirtilen yoldan belirli bir arama kriterleri dosyaları / dizinleri için geçerli dizin (dolayısıyla aramak için kullanılır .
).
-empty
Seçenek boş herhangi bir dosya ve dizin için de geçerlidir.
-type d
Seçenek için de geçerlidir dosya belirtilen türün; bu durumda d
dosya tipi dizinini ifade eder .
-delete
Seçenek gerçekleştirmek için eylemdir ve aramada bulunan tüm dosyalar için de geçerlidir.
rm -rf <directory-name>
. Bu, dosyaları ve alt dizinleri içeren tüm içeriği ile birlikte dizini de kaldırır. -r
Seçenek ise, yinelemeli silmek demektir -f
komut aracı silmeden önce istenmez. Bununla birlikte, bir dizini / dosyayı silmeden önce sorulmasını istiyorsanız, -f
seçeneği seçenekle değiştirin -i
.
stdout
tek bir komut (örneğin bir find
içine) stdin
(örn diğerinin rm
o / sen istemediğiniz dizinleri silip veya dosyaları silebilir beri), ancak, çok dikkatli olmak silme! Bunun nasıl yapılacağı hakkında daha fazla bilgi man
iç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.
Sen yararlanabilirsiniz rmdir
boş olmayan dizinleri silmek için komutun reddetmesi ve find -depth
opsiyon dizin ağacı aşağıdan yukarıya hareket etmesi:
find . -depth -exec rmdir {} \;
(ve hataları yoksay), ya da 2>/dev/null
gerçekten görmezden gelmek için ekleme yap .
-depth
Seçeneği find
dizin ağacının dibinde bularak başlar.
rm -rf
Dizindeki tüm dosyaları (ve alt dizinlerini ve ...) VE tüm dizinleri ve her şeyi silecektir .
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
rmdir * 2>/dev/null || true
. (
$HOME
. Kötü bir sırıtışla.
find . -type d -empty -delete -maxdepth 1
Çünkü sadece direk alt dizinlerini silmek istiyorsanız foo/
.
$ 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 r
biz erişiyorsunuz geçerli klasöre ayarlanır, s
içindeki dizinleri listesini içerir r
ve f
bu klasördeki dosyaların listesini içerecektir. Tabii ki f
ve s
boşsa, bunun boş olduğunu biliyoruz r
.empty
yukarıda belirtilen değerlendirmeye dayanarak, boş olan tüm dizinlerin bir listesini oluşturmamızı sağlar .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)
/bin/sh
sadece bash ile sınırlı değildir ve Python aslında bu ikisinden daha zarif bir dildir