Windows'ta boş dizinleri tekrar tekrar silin


93

Windows 7 makinemde yüzlerce alt dizini olmayan, yüzlerce dizinde bir dizin var. Bazılarında dosya var, bazılarında yok. Tüm boş dizinleri silmek istiyorum.

Del ve rmdir DOS komutuna baktığımızda, tüm dosyaları silmeden bunu tekrar tekrar yapabiliyormuşsunuz gibi görünmüyor. Bunu komut satırından yapmanın bir yolu var mı?


Bu sorunun basit bir cevabı olmadığına şaşırdım.
billpg

@billpg: o alabilir basit olarak: xcopy FROMDIR TODIR /s. Bu SO cevabını görün: stackoverflow.com/a/14742810
19:42

1
XCOPY dizinleri siler mi?
billpg

1
ROBOCOPY kullanılarak kolayca yapılabilir. Ayrıntılar için aşağıdaki cevaba bakınız.
Varun Sharma

Yanıtlar:


115

Boş Dizinleri Kaldır yardımcı programını kullanabilirsiniz .

Alternatif olarak, bu tek astarlı toplu iş dosyasını kullanabilirsiniz ( DownloadSquad'den ):

for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"

(bir parti dosyası içinde kullanıldığında, yerine %dile %%d)

Bu çalışır, çünkü rddosyaları içeren bir dizini kaldırmaz.


6
PS Potansiyel olarak tüm dosyaları silebilecek herhangi bir komut satırı komutunu denemeden önce, önce GUI tabanlı aracı denemenizi öneririz.
kaliban

1
Gerçekten boş olduğundan emin olun. Gizli bir desktop.ini hala bir dosya olarak kabul edilir. bir thumbs.db ile aynı. Bunun işe yarayıp yaramadığını doğrulamak istiyorsanız, içinde boş ve doldurulmuş dizinleri olan bir test dizini oluşturun. Çalışıyor, doğruladım.
kaliban

1
Evet. İşe yarıyor. Benim hatam.
EBGreen

8
/ f% d in ('dir / s / b') rmdir yapın "% d" rmdir boş olmayan bir klasörü kaldıramadığından çalışması gerekir
seanyboy

1
Bu işlevselliğin bağlam menüsüne nasıl ekleneceğini öğrenmek için stackoverflow.com/a/34025977/694360 adresine bakın .
mmj

49

ROBOCOPY'yi de kullanabilirsiniz. Çok basittir ve büyük hiyerarşi içindeki boş klasörleri silmek için de kullanılabilir.

ROBOCOPY folder1 folder1 /S /MOVE

Burada hem kaynak hem de hedef, folder1diğer dosyaları farklı klasöre taşımak yerine sadece boş klasörleri silmeniz gerektiği içindir. /Sseçenek, boş klasörlerin kopyalanmasını atlamaktır (yukarıdaki durumda hareket eder). Dosyalar aynı sürücünün içinde taşındığından, daha hızlıdır.


1
Sihirli. Böylece, boş olmayan tüm klasörler zaten bulundukları yere taşınır (yani hiçbir şey olmaz mı?) Ve boş klasörleri atlar mı? Ama sonra: neden onları atlamak silinebilir? Ve bu, iç içe geçmiş klasörlerin içine taşınmaz folder1mı? İyi test edilmedikçe korkutucu.
Arjan,

3
@Arjan Test ettim ve mükemmel çalışıyor! Çalışmasını anlamak, boş klasörler dışındaki tüm dosyaları farklı bir yere taşımak ve ardından soldaki boş klasörleri silmek gibidir. /MOVEönce dosyaları kopyalar ve sonra kopyaladıktan sonra kaynak dosyayı siler. Bu nedenle, /Skullanıldığı gibi , boş olmayan klasörleri hedefe kopyalar (yukarıdaki durumda aynı klasör). Daha sonra boş klasörleri siler (boş klasörlerin zaten kopyalanmış olduğu düşüncesi gibi). Hayır, gelmez içine yuvalanmış klasörleri taşımak folder1ROBOCOPY yinelemeli klasörleri hareket ederken,.
Varun Sharma

3
UNC yolları ile bile çalışıyor (en azından win7'de)! Parlak !
Arioch '

2
Bu, herhangi bir üçüncü taraf yazılımı gerekmeden çok zarif bir çözümdür. Teşekkür ederim!
Marcus Mangelsdorf

1
Bu sadece sihrini yaptı ve mükemmel çalıştı. Teşekkürler!
CharleyDC5

15

Cygwin GNU bul ile birlikte geldiğinden bunu yapabilirsiniz:

find . -type d -empty -delete

Veya bir klasör artık kalmadığında gürültüyü önlemek için:

find . -type d -empty -execdir rmdir {} +

Bu şimdi de Windows 10 Bash kullanılarak yapılabilir.
Mart Ho,

Windows 10 yüklemem için bu ( find . -type d -empty -delete) komut isteminde aşağıdaki hatayı FIND: Parameter format not correct
vererek

7

EmptyFolderNuker adlı ücretsiz yardımcı program bunu seçtiğiniz bir temel klasörden yapar. Ayrıca yalnızca boş alt dizinler içeren bu dizinleri kaldırır.


1
Tek astarlı toplu iş dosyası benim için çalışmadı ("%% d şu anda beklenmeyen hata" hatası alıyorum) ve Boş Dizinleri Kaldır programı yüklenmeyecek (bağlantılı sayfada olmadığını söylüyor. Yine de Windows 7 ile uyumlu). Bu program bir cazibe gibi çalıştı.
Phoenix

1
User36580 aşağıda yazdığı gibi "muhtemelen doğrudan komut satırından çalışıyorsunuzdur. Bu durumda,%% çiftini tek bir% olarak değiştirin"
Lachlan McD.

1
Bunu, saf komut satırı sürümünden çok seviyorum, çünkü silinen öğelerin önizlemesini görüntülemenizi sağlıyor. Kullanarak her zaman komut satırından çağırabilirsiniz "%~dp0\EmptyFolderNuker.exe" %cd%.
Jeroen Wiert Pluimers,

1
@ rob-kam "EmptyFolderNuker" URL’si artık mevcut değil.
PeterCo

@PeterCo Teşekkürler, şimdi düzeltildi.
Rob Kam,

0

Eğer varsa Cygwin yüklü, bunu yapabilirdi:

find -type d -exec rmdir {} \;

4
Şart değil. Bu yalnızca boş alt dizinlere sahip dizinleri silmeyebilir. Tersine çevirmeniz gerekebilir. -tipi bulmak d -print0 | tac | xargs -0 rmdir
Ryan Thompson

Daha önce "tac" hakkında bir şey bilmiyordum. Bu gerçekten çok hoş!
Anthony Giorgio

1
Veya kullanın . Seçenek söyler çıktı sırasını tersine çevirmek gibi bir şey yapmak için - bu ilk derin dizin seviyelerine gider, sonra tekrar yukarı yolunda çalışır. find (starting-directory) -depth -type d ...-depthfind
G-Man

0

Emacs üzerinde çalışıyorsanız (bu platformu agnostik hale getirir), aşağıdakiler işe yarar:

(defun *-delete-empty-directories (root-directory)
  "Recursively delete empty directories in ROOT-DIRECTORY.

When called from dired, `dired-current-directory' is used for
ROOT-DIRECTORY."

  ;; Interface
  (interactive (list (if (eq major-mode 'dired-mode)
                         (expand-file-name (dired-current-directory))
                       (read-from-minibuffer "Root directory: "))))
  (when (or (null root-directory) (string= "" root-directory))
    (user-error "No root directory provided"))
  (when (called-interactively-p 'interactive)
    (unless (yes-or-no-p (format "Delete all non-empty directories in `%s'? "
                                 root-directory))
      (user-error "Directory `%s' has been left untouched" root-directory)))

  ;; Implementation
  (require 'f)
  (let ((entries (f-directories root-directory)))
    (while entries
      (let ((curdir (car entries)))
        (when (f-directories curdir)
          (*-delete-empty-directories curdir))
        (unless (f-entries curdir)
          (delete-directory curdir)
          (message "Directory deleted: `%s'" curdir))
        (setq entries (cdr entries)))))

... Lütfen bana emacs'te bunu başarmak için hepsini yazmak zorunda kalmayacağınızı söyleyin.
Hashim,

1
@Hashim Fikir, sizin init'inizde tanımlanmış ve daha sonra bir anahtara bağlı olduğunuzdur. Teknik olarak Değer istersem buna bağlı olabilirdim , ama buna ortak bir ihtiyacım olmadığından, M-x *ded RETyazmam gereken tek şey tamamlandı ve yapıldı. (Bunu her seferinde gerçekten yazmak zorunda kalsaydım, kesinlikle saçma olacağınız konusunda haklısınız - neyse ki durum böyle değil.)
Sean Allred

Yeterince adil, bu daha makul geliyor.
Hashim

M-x *ded RETHerhangi bir önemi var mı yoksa rastgele mi? İkincisi ise, atadığınız tüm kısayolları nasıl takip edersiniz emacs? Ezberlemek yeterli mi yoksa kendinizi aramak zorunda kalıyor musunuz?
Hashim

1
@Hashim *dedtam fonksiyon isminin kısaltmasıdır *-delete-empty-directories. Birçok tamamlama motoru (benim kullandığım sarmaşık gibi) bu tür bulanık eşleşmeleri anlıyor. Onları ezberlemeye gelince ... sadece yapmak zorunda değilim. Tanımladığım işlevlerin tümü *, bir anahtara bağlı olmadıklarında kolayca bulabilmem için başlar. Aksi takdirde, emacs, işlevi çağırmanın daha hızlı bir yolu olup olmadığını söyler. Her şey başarısız olursa, her zaman var apropos.
Sean Allred

0

Gareth ve G-Man'ın mesajlarını birleştiriyor:

find . -depth -type d -empty -execdir rmdir {} +

Düzenleme: Ama bu benim PATH var 'C' nedeniyle bir güvenlik hatası verdi var ... bunun yerine:

$find . -depth -type d -empty | while read dir; do (rmdir -v $dir); done

Xargs kullanmıyorum çünkü bir giriş satırı sınırına sahip görünüyor (yaklaşık 1024 satır, sanırım?)

 while read x; do (command $x); done

sadece girişi olduğu sürece devam eder. Sonuçları görmek istemiyorsanız ve / veya daha hızlı çalışmasını istiyorsanız '-v' ayrıntılı bayrağını bırakın.


0

Hmmm ... belki daha basit bir çözüm:

for /d /r %d in (*.*) do rd "%d"

Bunu, boş klasörlerin silinmesini istediğiniz klasörden başlatın.

/ d - klasörler üzerinde çalışacak, dosyalar üzerinde değil / r - alt dizinleri yineleyecek

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.