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

Supprimer récursivement les répertoires vides dans Windows

Advertisement

J'ai un répertoire sur ma machine Windows 7 qui comporte des centaines, voire des milliers de sous-répertoires. Certains contiennent des fichiers, d'autres pas. 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. Y a-t-il un moyen de faire cela depuis la ligne de commande ?

Advertisement

Réponses (9)

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

Vous pouvez utiliser l'utilitaire Remove Empty Directories .

Alternativement, vous pouvez utiliser ce fichier batch d'une ligne (de DownloadSquad ) :

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

(si utilisé dans un fichier batch, remplacer %d par %%d)

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

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

Vous pouvez également utiliser ROBOCOPY. Il est très simple et peut également être utilisé pour supprimer des dossiers vides à l'intérieur d'une grande hiérarchie.

ROBOCOPY folder1 folder1 /S /MOVE

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

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

L'utilitaire gratuit EmptyFolderNuker fait cela très bien, à partir d'un dossier de base de votre choix. Il supprime également les répertoires qui ne contiennent que des sous-répertoires vides.

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

Aucune des réponses précédentes ne me convenait, j'ai donc constitué le dossier 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 au répertoire de premier niveau que vous voulez nettoyer. À l'invite de la ligne de commande, lancez :

EmptyDirectoriesRemove.cmd

Des avertissements apparaîtront pour les répertoires non vides.

Avertissements habituels : Utilisez à vos risques et périls. Sauvegarder avant de tester. etc.

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

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

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

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

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

Démarrez ceci à partir du dossier que vous voulez supprimer les dossiers vides.

/d - fonctionnera sur les dossiers, pas sur les fichiers /r - récurera les sous-dossiers

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

Combinaison des postes de Gareth et de G-Man :

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

Edit : Mais cela a donné une erreur de sécurité à cause du ‘C’ dans ma var…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 ligne d'entrée (d'environ 1024 lignes, je pense ?), alors que

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

continue juste tant qu'il y a de l'entrée. Laissez tomber le drapeau verbeux “-v” si vous ne voulez pas voir les résultats et/ou si vous voulez que le système fonctionne plus rapidement.

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

Le shell 4NT (aujourd'hui Take Command) a une option /sx pour “DEL”. Le /S est récursif, le X ajouté est la suppression des Dirs vides.

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

Si vous travaillez dans emacs (qui rend cette plateforme agnostique), les travaux suivants sont possibles :

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