it-swarm-eu.dev

Elimina ricorsivamente le directory vuote in Windows

Ho una directory sulla mia macchina Windows 7 che ha centinaia se non migliaia di sottodirectory. Alcuni hanno file, altri no. Voglio cancellare tutte le directory vuote.

Osservando il comando del e rmdir DOS, non sembra che si possa fare ricorsivamente questo senza cancellare tutti i file. C'è un modo per farlo dalla riga di comando?

87
mohlsen

Puoi usare Remove Empty Directories utility.

In alternativa puoi usare questo file batch one-liner (da DownloadSquad ):

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

(se utilizzato all'interno di un file batch, sostituire %d con %%d)

Questo funziona perché rd non rimuoverà una directory che contiene file.

106
caliban

Puoi anche usare ROBOCOPY. È molto semplice e può anche essere usato per cancellare cartelle vuote all'interno di una grande gerarchia.

ROBOCOPY folder1 folder1 /S /MOVE

Qui sia l'origine che la destinazione sono folder1, in quanto è sufficiente eliminare le cartelle vuote, invece di spostare altri file in una cartella diversa. L'opzione /S è di saltare la copia (spostando, nel caso precedente) cartelle vuote. È anche più veloce quando i file vengono spostati all'interno della stessa unità.

41
Varun Sharma

Poiché Cygwin viene fornito con GNU find, puoi farlo:

find . -type d -empty -delete

O per evitare il rumore quando una cartella non esiste più:

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

L'utilità gratuita EmptyFolderNuker esegue questa operazione, da una cartella di base di tua scelta. Rimuove anche quelle directory contenenti solo sottodirectory vuote.

6
Rob Kam

L'eccellente Glary Utilities ha questo e un sacco di altre grandi caratteristiche.

1
outsideblasts

Se lavori in emacs (rendendo questa piattaforma agnostica), i seguenti lavori:

(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 ... forse anche una soluzione più semplice:

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

Inizia dalla cartella in cui vuoi eliminare le cartelle vuote.

/ d - funzionerà su cartelle, non file/r - ricodificherà i sottodirectory

0

Combinando i post di Gareth e G-Man:

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

Modifica: Ma questo ha dato un errore di sicurezza a causa di "C" nel mio PATH var ... quindi invece:

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

Non uso xargs perché sembra avere un limite di righe di input (di circa 1024 linee, credo?), Mentre

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

continua ad andare avanti per tutto il tempo che ha inserito. Lasciare il flag verboso '-v' se non vuoi vedere i risultati e/o vuoi che funzioni più velocemente.

0
skeetastax

Se hai Cygwin installato, puoi fare questo:

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