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?
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.
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à.
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 {} +
L'utilità gratuita EmptyFolderNuker esegue questa operazione, da una cartella di base di tua scelta. Rimuove anche quelle directory contenenti solo sottodirectory vuote.
L'eccellente Glary Utilities ha questo e un sacco di altre grandi caratteristiche.
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)))))
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
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.
Se hai Cygwin installato, puoi fare questo:
find -type d -exec rmdir {} \;