122 votes

Supprimer récursivement les répertoires vides dans Windows

J'ai un répertoire sur ma machine Windows 7 qui contient des centaines, voire des milliers de sous-répertoires. Certains d'entre eux contiennent des fichiers, d'autres non. Je veux supprimer tous les répertoires vides.

En regardant la commande DOS del et rmdir, il ne semble pas que vous puissiez faire cela récursivement sans supprimer tous les fichiers. Existe-t-il un moyen de le faire à partir de la ligne de commande ?

0voto

Metro Smurf Points 14234

Si vous avez Cygwin installé, vous pourriez faire ceci :

find -type d -exec rmdir {} \;

0voto

Sean Allred Points 1082

Si vous travaillez avec emacs (ce qui rend la plateforme agnostique), la méthode suivante fonctionne :

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

0voto

skeetastax Points 241

En combinant les messages de Gareth et de G-Man :

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

Éditer : Mais cela a donné une erreur de sécurité à cause de 'C' dans ma variable PATH...donc à la place :

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

Je n'utilise pas xargs parce qu'il semble avoir une limite de lignes d'entrée (d'environ 1024 lignes, je pense ?), alors que

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

continue à fonctionner aussi longtemps qu'il a des données. N'utilisez pas le drapeau verbeux '-v' si vous ne voulez pas voir les résultats et/ou si vous voulez que cela fonctionne plus rapidement.

0voto

Jahmic Points 311

Aucune des réponses précédentes n'a fonctionné pour moi, j'ai donc créé le fichier suivant :

EmptyDirectoriesRemove.cmd

Contenu :

@setlocal enableextensions enabledelayedexpansion

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

endlocal

Utilisation : Cd jusqu'au répertoire de premier niveau que vous voulez nettoyer. À l'invite de la ligne de commande, exécutez :

EmptyDirectoriesRemove.cmd

Des avertissements s'afficheront pour les répertoires non vides.

Avis de non-responsabilité habituel : Utilisez à vos risques et périls. Sauvegarder avant de tester. etc.

0voto

Le 4NT Shell (aujourd'hui Take Command) a une option /sx pour "DEL". /S est récursif, le X apposé est supprimer les répertoires vides.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X