it-swarm.asia

Windows'ta boş dizinleri tekrar tekrar silin

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ı?

87
mohlsen

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

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

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

(bir toplu iş dosyasında kullanılıyorsa, %d öğesini %%d ile değiştirin)

Bu çalışır çünkü rd dosyaları içeren bir dizini kaldırmaz.

106
caliban

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 folder1, çünkü diğer dosyaları farklı klasörlere taşımak yerine sadece boş klasörleri silmeniz gerekir. /S seçeneği, boş klasörlerin kopyalanmasını (yukarıdaki durumda, hareketli) atlamaktır. Dosyalar aynı sürücünün içinde taşındığından, daha hızlıdır.

41
Varun Sharma

Cygwin, GNU find 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 {} +
15
Michael

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

6
Rob Kam

Mükemmel Glary Utilities var ve bir sürü harika özellik var.

1
outsideblasts

Emacs'de ç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)))))
0
Sean Allred

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

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?), Oysa

 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
skeetastax

Eğer Cygwin kurulmuşsa, şunları yapabilirsiniz:

find -type d -exec rmdir {} \;
0
Anthony Giorgio