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

Borrar recursivamente directorios vacíos en Windows

Tengo un directorio en mi máquina Windows 7 que tiene cientos, si no miles, de subdirectorios. Algunos de ellos tienen archivos, otros no. Quiero borrar todos los directorios vacíos.

Mirando el comando del y rmdir DOS, no parece que se pueda hacer esto recursivamente sin borrar todos los archivos. ¿Hay alguna manera de hacer esto desde la línea de comandos?

Respuestas (9)

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

Puede utilizar la utilidad Remove Empty Directories .

Como alternativa, puede utilizar este archivo por lotes de una sola línea (de DownloadSquad ):

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

(si se utiliza dentro de un archivo por lotes, sustituya %d por %%d)

Esto funciona porque rd no eliminará un directorio que contenga archivos.

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

También puede utilizar ROBOCOPY. Es muy sencillo y también se puede utilizar para borrar carpetas vacías dentro de una gran jerarquía.

ROBOCOPY folder1 folder1 /S /MOVE

Aquí tanto el origen como el destino son folder1, ya que sólo necesita eliminar las carpetas vacías, en lugar de mover otros archivos a una carpeta diferente. La opción /S es para omitir la copia (movimiento, en el caso anterior) de carpetas vacías. También es más rápido ya que los archivos se mueven dentro de la misma unidad.

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

La utilidad gratuita EmptyFolderNuker hace esto bien, desde una carpeta base de su elección. También elimina aquellos directorios que sólo contienen subdirectorios vacíos.

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

Ninguna de las respuestas anteriores me funcionó, así que hice el siguiente archivo:

EmptyDirectoriesRemove.cmd

Contenido:

@setlocal enableextensions enabledelayedexpansion

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

endlocal

Uso: Cd al directorio de nivel superior que quieras limpiar. Desde la línea de comandos, ejecute

EmptyDirectoriesRemove.cmd

Se mostrarán advertencias para los directorios no vacíos.

Las advertencias habituales: Utilícelo bajo su responsabilidad. Realice una copia de seguridad antes de probarlo, etc.

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

Si tienes Cygwin instalado, podrías hacer esto:

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

Hmmm… tal vez una solución más simple:

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

Inicie esto desde la carpeta que quiere que se borren las carpetas vacías.

/d - funcionará en las carpetas, no en los archivos /r - recurrirá a los subdirectorios

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

Combinando los posts de Gareth y G-Man:

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

Editar: Pero eso dio un error de seguridad debido a ‘C’ en mi var de PATH…así que en su lugar:

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

No uso xargs porque parece que tiene un límite de líneas de entrada (¿de unas 1024 líneas, creo?), mientras que

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

sigue adelante mientras tenga entrada. Omita la bandera verbosa ‘-v’ si no quiere ver los resultados y/o quiere que se ejecute más rápido.

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

El shell 4NT (hoy en día Take Command) tiene una opción /sx para “DEL”. /S es recursivo, la X añadida es eliminar los dirs vacíos.

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

Si estás trabajando en emacs (haciendo esto agnóstico a la plataforma), lo siguiente funciona:

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