Excluir recursivamente diretórios vazios no Windows

80

Eu tenho um diretório na minha máquina com Windows 7 que possui centenas, se não milhares, de subdiretórios. Alguns deles têm arquivos, outros não. Eu quero excluir todos os diretórios vazios.

Olhando para o comando del e rmdir do DOS, não parece que você possa recursivamente fazer isso sem excluir todos os arquivos. Existe uma maneira de fazer isso a partir da linha de comando?

    
por mohlsen 11.09.2009 / 15:38

9 respostas

99

Você pode usar o utilitário Remover diretórios vazios .

Como alternativa, você pode usar este arquivo em 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 arquivo de lote, substitua %d por %%d )

Isso funciona porque rd não removerá um diretório que contenha arquivos.

    
por 11.09.2009 / 15:44
35

Você também pode usar o ROBOCOPY. É muito simples e também pode ser usado para excluir pastas vazias dentro de uma grande hierarquia.

ROBOCOPY folder1 folder1 /S /MOVE

Aqui, a origem e o destino são folder1 , pois você só precisa excluir pastas vazias, em vez de mover outros arquivos para uma pasta diferente. A opção /S é pular as pastas vazias copiando (movendo, no caso acima). Também é mais rápido, pois os arquivos são movidos dentro da mesma unidade.

    
por 13.09.2015 / 12:25
16

Como o Cygwin vem com o GNU find, você pode fazer isso:

find . -type d -empty -delete

Ou para evitar o ruído quando uma pasta não existe mais:

find . -type d -empty -execdir rmdir {} +
    
por 31.12.2009 / 23:52
6

O utilitário gratuito EmptyFolderNuker faz isso bem, de uma pasta base de sua escolha. Também remove esses diretórios contendo apenas subdiretórios vazios.

    
por 11.09.2009 / 18:08
1

Os excelentes Glary Utilities tem esse e um monte de outros ótimos recursos.

    
por 11.09.2009 / 23:32
1

Se você tiver o Cygwin instalado, poderá fazer isso:

find -type d -exec rmdir {} \;
    
por 11.09.2009 / 23:50
0

Se você estiver trabalhando no emacs (tornando este agnóstico de plataforma), os seguintes trabalhos:

(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)))))
    
por 06.05.2015 / 16:57
0

Combinando os posts de Gareth e G-Man:

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

Editar: Mas isso deu um erro de segurança por causa de 'C' no meu var PATH ... então, em vez disso:

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

Eu não uso xargs porque parece ter um limite de linha de entrada (de aproximadamente 1024 linhas, eu acho?), enquanto

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

apenas continua enquanto contiver entradas. Deixe de fora o sinalizador verboso '-v' se você não quiser ver os resultados e / ou quiser que ele seja executado mais rapidamente.

    
por 03.04.2017 / 11:20
0

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

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

Inicie isto a partir da pasta onde deseja que as pastas vazias sejam excluídas.

/ d - funcionará em pastas, não em arquivos / r - reconsiderará subdiretórios

    
por 03.09.2018 / 01:41