2009-09-11 13:38:58 +0000 2009-09-11 13:38:58 +0000
100
100

Cancellare ricorsivamente le directory vuote in Windows

Ho una directory sulla mia macchina Windows 7 che ha centinaia se non migliaia di sottodirectory. Alcune di esse hanno dei file, altre no. Voglio eliminare tutte le directory vuote.

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

Risposte (9)

121
121
121
2009-09-11 13:44:35 +0000

Puoi usare l'utility Remove Empty Directories .

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 usato dentro un file batch, sostituisci %d con %%d)

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

53
53
53
2015-09-13 10:25:42 +0000

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

ROBOCOPY folder1 folder1 /S /MOVE

Qui sia l'origine che la destinazione sono folder1, dato che hai solo bisogno di cancellare le cartelle vuote, invece di spostare altri file in una cartella diversa. L'opzione /S è di saltare la copia (lo spostamento, nel caso di cui sopra) delle cartelle vuote. È anche più veloce perché i file vengono spostati all'interno della stessa unità.

7
7
7
2009-09-11 16:08:08 +0000

L'utility gratuita EmptyFolderNuker lo fa bene, da una cartella di base di vostra scelta. Rimuove anche le directory che contengono solo sottocartelle vuote.

0
0
0
2019-12-13 04:09:18 +0000

Nessuna delle risposte precedenti ha funzionato per me, così ho fatto il seguente file:

EmptyDirectoriesRemove.cmd

Contenuto:

@setlocal enableextensions enabledelayedexpansion

:walk_tree
for /D %%d in (*) do (
cd %%d
@CALL :walk_tree %%d
cd ..
rd %%d
)

endlocal

Uso: Cd alla directory di primo livello che volete ripulire. Dal prompt della riga di comando, esegui:

EmptyDirectoriesRemove.cmd

Verranno visualizzati avvertimenti per le directory non vuote.

Solite avvertenze: Usate a vostro rischio e pericolo. Fate un backup prima di provare, ecc.

0
0
0
2009-09-11 21:50:13 +0000

Se avete installato Cygwin , potete fare così:

find -type d -exec rmdir {} \;
0
0
0
2018-09-02 23:41:02 +0000

Hmmm… forse una soluzione ancora più semplice:

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

Avvia questo dalla cartella in cui vuoi che vengano cancellate le cartelle vuote.

/d - lavorerà sulle cartelle, non sui file /r - ricorrerà alle sottocartelle

0
0
0
2017-04-03 09:20:06 +0000

Combinando i post di Gareth e G-Man:

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

Edit: Ma questo ha dato un errore di sicurezza a causa di ‘C’ nella mia var PATH…quindi invece:

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

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

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

continua ad andare avanti finché ha input. Lasciate fuori il flag ‘-v’ verbose se non volete vedere i risultati e/o volete che sia più veloce.

0
0
0
2020-01-10 08:31:27 +0000

La shell 4NT (oggi Take Command) ha un'opzione /sx per “DEL”. /S è ricorsivo, la X aggiunta è rimuovere le cartelle vuote.

0
0
0
2015-05-06 14:57:59 +0000

Se state lavorando in emacs (il che lo rende indipendente dalla piattaforma), il seguente funziona:

(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)))))