web-dev-qa-db-fra.com

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 ont des fichiers, d'autres pas. Je veux supprimer tous les répertoires vides.

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

87
mohlsen

Vous pouvez utiliser Supprimer les répertoires vides utility.

Sinon, vous pouvez utiliser ce fichier de commandes à une ligne (à partir de DownloadSquad ):

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

(si utilisé dans un fichier de commandes, remplacez %d par %%d)

Cela fonctionne car rd ne supprimera pas un répertoire contenant des fichiers.

106
caliban

Vous pouvez également utiliser ROBOCOPY. Il est très simple et peut également être utilisé pour supprimer des dossiers vides dans une grande hiérarchie.

ROBOCOPY folder1 folder1 /S /MOVE

Ici, la source et la destination sont folder1, car il vous suffit de supprimer les dossiers vides, au lieu de déplacer d'autres fichiers dans un autre dossier. L'option /S permet de ne pas copier (déplacer, dans le cas ci-dessus) des dossiers vides. Il est également plus rapide que les fichiers sont déplacés à l'intérieur du même lecteur.

41
Varun Sharma

Puisque Cygwin est livré avec GNU find, vous pouvez le faire:

find . -type d -empty -delete

Ou pour éviter le bruit lorsqu'un dossier n'existe plus:

find . -type d -empty -execdir rmdir {} +
15
Michael

L'utilitaire gratuit EmptyFolderNuker fonctionne très bien à partir du dossier de base de votre choix. Il supprime également les répertoires contenant uniquement des sous-répertoires vides.

6
Rob Kam

L'excellent Glary Utilities a ceci et un tas d'autres fonctionnalités intéressantes.

1
outsideblasts

Si vous travaillez dans emacs (rendant cette plate-forme agnostique), les opérations suivantes fonctionnent:

(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)))))
0
Sean Allred

Hmmm ... peut-être même une solution plus simple:

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

Commencez par le dossier où vous voulez que les dossiers vides soient supprimés.

/ d - travaillera sur les dossiers, pas les fichiers/r - recurse les sous-répertoires

0
Daniel Mošmondor

Combinaison des messages de Gareth et de G-Man:

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

Edit: Mais cela a donné une erreur de sécurité à cause de 'C' dans mon PATH var ... donc à la place:

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

Je n’utilise pas xargs car il semble y avoir une limite de lignes en entrée (environ 1024 lignes, je pense?), Alors que

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

continue à aller aussi longtemps qu'il a son mot à dire. Si vous ne voulez pas voir les résultats et/ou si vous voulez que les résultats soient plus rapides, laissez l'indicateur verbose '-v'.

0
skeetastax

Si vous avez Cygwin installé, vous pouvez le faire:

find -type d -exec rmdir {} \;
0
Anthony Giorgio