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

Eliminar recursivamente os directórios vazios no Windows

Tenho um directório na minha máquina Windows 7 que tem centenas se não milhares de subdirectórios. Alguns deles têm ficheiros, outros não. Quero apagar todos os directórios vazios.

Olhando para o comando del e rmdir DOS, não parece que se possa fazer isto recursivamente sem apagar todos os ficheiros. Existe alguma forma de o fazer a partir da linha de comando?

Respostas (9)

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

Pode usar Remover Directórios Vazios utilidade.

Em alternativa, pode usar este ficheiro de lote de uma linha (de DownloadSquad ):

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

(se usado dentro de um ficheiro de lote, substituir %d por %%d)

& Isto funciona porque rd não removerá um directório que contenha ficheiros.

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

Também se pode utilizar ROBOCOPY. É muito simples e também pode ser utilizada para eliminar pastas vazias dentro de uma grande hierarquia.

ROBOCOPY folder1 folder1 /S /MOVE

Aqui tanto a fonte como o destino são folder1, uma vez que só precisa de apagar pastas vazias, em vez de mover outros ficheiros para pastas diferentes. /S opção é saltar a cópia (movendo, no caso acima) das pastas vazias. É também mais rápido, pois os ficheiros são movidos dentro da mesma unidade.

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

O utilitário gratuito EmptyFolderNuker faz esta multa, a partir de uma pasta base à sua escolha. Também remove os directórios que contêm apenas subdirectórios vazios.

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

Nenhuma das respostas anteriores funcionou para mim, por isso fiz o seguinte ficheiro:

EmptyDirectoriesRemove.cmd

Conteúdo:

@setlocal enableextensions enabledelayedexpansion

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

endlocal

Utilização: Cd para o directório de nível superior que pretende limpar. A partir da linha de comando, corra:

EmptyDirectoriesRemove.cmd

Avisos aparecerão para directórios não vazios.

& Avisos habituais: Utilização por sua conta e risco. Cópias de segurança antes de testar. etc.

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

Se tiver Cygwin instalado, pode fazer isto:

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

Hmmm…. talvez uma solução ainda mais simples:

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

Comece isto a partir da pasta que pretende que as pastas vazias sejam apagadas.

/d - irá funcionar em pastas, não em ficheiros /r - irá repetir-se nos subdir

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

Combinando os postos de Gareth e de G-Man:

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

Editar: Mas isso deu um erro de segurança por causa do ‘C’ na minha var PATH…em vez disso:

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

Não uso xargs porque parece ter um limite de linha de entrada (de cerca de 1024 linhas, penso eu?), enquanto que

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

apenas continua enquanto tiver entrada. Deixe de fora a bandeira ‘-v’ verbosa se não quiser ver os resultados e/ou se quiser que ela corra mais depressa.

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

A concha 4NT (actualmente Take Command) tem uma opção /sx para “DEL”. /S é recursiva, o X anexado é remover dirs vazios.

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

Se estiver a trabalhar em emacs (tornando esta plataforma agnóstica), os trabalhos seguintes funcionam:

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