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?
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.
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.
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 {} +
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.
L'excellent Glary Utilities a ceci et un tas d'autres fonctionnalités intéressantes.
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)))))
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
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'.
Si vous avez Cygwin installé, vous pouvez le faire:
find -type d -exec rmdir {} \;