Question 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 non. Je veux supprimer tous les répertoires vides.

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


75
2017-09-11 13:38


origine


Je suis étonné qu'il n'y ait pas de réponse simple à cette question. - billpg
@billpg: simple comme cela pourrait arriver: xcopy FROMDIR TODIR /s. Voir cette réponse SO: stackoverflow.com/a/14742810 - eckes
XCOPY supprime les répertoires? - billpg
Cela peut être fait facilement en utilisant ROBOCOPY. Voir ma réponse ci-dessous pour plus de détails. - Varun Sharma


Réponses:


Vous pouvez utiliser Supprimer les répertoires vides utilitaire.

Sinon, vous pouvez utiliser ce fichier de commandes à une ligne (à partir de TéléchargerSquad):

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

(si utilisé dans un fichier batch, remplacez %d avec %%d)

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


95
2017-09-11 13:44



Je vous suggère d'essayer d'abord l'outil basé sur l'interface graphique avant d'essayer toute commande de ligne de commande susceptible de supprimer tous les fichiers. - caliban
Assurez-vous qu'il est vraiment vide. Un desktop.ini caché est toujours considéré comme un fichier. identique à un thumbs.db. Si vous voulez vérifier si cela fonctionne, créez un répertoire de test avec des répertoires vides et remplis. Cela fonctionne, j'ai vérifié. - caliban
Oui. Ça marche. Mon erreur. - EBGreen
pour / f% d dans ('dir / s / b'), rmdir "% d" devrait fonctionner car rmdir ne peut pas supprimer un dossier non vide - seanyboy
Regarder stackoverflow.com/a/34025977/694360pour savoir comment ajouter cette fonctionnalité au menu contextuel. - mmj


Vous pouvez également utiliser ROBOCOPY. C'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 toutes les deux folder1, car vous n'avez qu'à supprimer les dossiers vides, au lieu de déplacer d'autres fichiers dans un autre dossier. /S L'option consiste à ignorer la copie (en mouvement, dans le cas ci-dessus) des dossiers vides. Il est également plus rapide car les fichiers sont déplacés dans le même lecteur.


32
2017-09-13 10:25



La magie. Cela déplace donc tous les dossiers non vides à l'emplacement même où ils se trouvaient déjà (donc, rien ne le fait?) Et ignore les dossiers vides? Mais alors: pourquoi les sauter entraînerait-il une suppression? Et ne serait-ce pas déplacer des dossiers imbriqués dans folder1? Effrayant, sauf bien testé. - Arjan
@Arjan Je l'ai testé et ça fonctionne parfaitement! Pour comprendre son fonctionnement, il est préférable de déplacer tous les fichiers vers des emplacements différents, à l'exception des dossiers vides, puis de supprimer les dossiers vides restants. /MOVE copie d'abord les fichiers, puis supprime le fichier source après la copie. Donc, comme /S est utilisé, il copie les dossiers non vides vers la destination (même dossier dans le cas ci-dessus). Ensuite, il supprime les dossiers vides (par exemple, il pense que les dossiers vides ont déjà été copiés). Non ça ne fait pas déplacer les dossiers imbriqués dans folder1, comme ROBOCOPY déplace les dossiers de manière récursive. - Varun Sharma
il fonctionne même avec les chemins UNC (au moins sur win7)! Brillant ! - Arioch 'The
Robocopy peut-il déplacer des fichiers vers la corbeille? - user598527
Ceci est une solution très élégante sans aucun logiciel tiers nécessaire. Je vous remercie! - Marcus Mangelsdorf


Cygwin étant fourni 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 {} +

16
2017-12-31 22:52



Cela peut maintenant être fait avec Windows 10 Bash. - March Ho
Pour mon installation de Windows 10 ceci (find . -type d -empty -delete) échoue à l'invite de commande avec l'erreur suivante: FIND: Parameter format not correct - ImpressTheNet Web Developer


L'utilitaire gratuit EmptyFolderNuker fait très bien, à partir d'un dossier de base de votre choix. Il supprime également ces répertoires contenant uniquement des sous-répertoires vides.


6
2017-09-11 16:08



Le fichier de commandes à une ligne ne fonctionnait pas pour moi (j'obtiens l'erreur "%% d était inattendu pour le moment."), Et le programme Remove Empty Directories (Installer les répertoires vides) ne s'installera pas (il est dit sur la page liée qu'il n'est pas compatible avec Windows 7 de toute façon). Ce programme a fonctionné comme un charme. - Phoenix
Comme écrit par user36580 ci-dessous, "il est probable que vous exécutiez directement depuis la ligne de commande. Dans ce cas, remplacez le double %% par un seul%" - Lachlan McD.
J'aime cela par rapport à la version en ligne de commande pure, car elle vous permet de prévisualiser les éléments supprimés. Vous pouvez toujours l'appeler depuis la ligne de commande en utilisant "%~dp0\EmptyFolderNuker.exe" %cd%. - Jeroen Wiert Pluimers


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


1
2017-09-11 21:32





Si tu as Cygwin installé, vous pouvez le faire:

find -type d -exec rmdir {} \;

1
2017-09-11 21:50



Pas nécessairement. Cela pourrait ne pas supprimer les répertoires contenant uniquement des sous-répertoires vides. Vous devrez peut-être l'inverser. find -type d -print0 | tac | xargs -0 rmdir - Ryan Thompson
Je n'ai jamais entendu parler de "tac" avant. C'est vraiment chouette! - Anthony Giorgio
Ou utiliser find   (starting-directory)   -depth   -type d .... le -depth option raconte find pour faire quelque chose comme inverser l'ordre de la sortie - il passe d'abord aux niveaux de répertoire les plus profonds, puis revient à la normale. - G-Man


Si vous travaillez dans emacs (ce qui rend cette plate-forme indépendante), les travaux suivants:

(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
2018-05-06 14:57



... S'il vous plaît dites-moi que vous n'auriez pas à taper tout cela pour accomplir ceci dans emacs. - Hashim
@Hashim L'idée est que vous l'avez définie dans votre init, puis liée à une clé. Techniquement, je pourrais l'avoir lié à D si je le voulais, mais comme je n’ai pas de besoin commun, tout ce que je dois taper, c’est M-x *ded RET et bam-fait. (Si je devais effectivement taper ceci à chaque fois, vous avez absolument raison, ce serait absurde - heureusement que ce n’est pas le cas.) - Sean Allred
Assez juste, cela semble plus plausible. - Hashim
Est-ce que M-x *ded RET ont une signification ou est-ce aléatoire? Si ce dernier, comment gardez-vous un suivi de tous les raccourcis que vous avez assignés dans emacs? Est-ce que la mémorisation suffit ou est-ce que vous vous trouvez à chercher? - Hashim
@Hashim *ded est une abréviation pour le nom complet de la fonction *-delete-empty-directories. De nombreux moteurs d’achèvement (tels que le lierre, celui que j’utilise) comprennent ce type d’appariement flou. Quant à les garder mémorisés ... je n’ai tout simplement pas besoin de le faire. Les fonctions que j'ai définies commencent toutes par * donc je peux facilement les trouver s'ils ne sont pas liés à une clé. Sinon, emacs lui-même me dira s'il y avait un moyen plus rapide d'appeler la fonction. Si tout le reste échoue, il y a toujours apropos. - Sean Allred


Combinant les posts de Gareth et de G-Man:

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

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

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

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

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

ne cesse de continuer tant qu'il y a des entrées. Laissez de côté l'indicateur verbeux '-v' si vous ne voulez pas voir les résultats et / ou souhaitez qu'il s'exécute plus rapidement.


0
2018-04-03 09:20