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

Recursief lege mappen verwijderen in Windows

Ik heb een map op mijn Windows 7 machine die honderden, zo niet duizenden submappen heeft. Sommige daarvan bevatten bestanden, andere niet. Ik wil alle lege mappen verwijderen.

Kijkend naar de del en rmdir DOS commando’s, lijkt het er niet op dat je dit recursief kunt doen zonder alle bestanden te verwijderen. Is er een manier om dit vanaf de commandoregel te doen?

Antwoorden (9)

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

U kunt het hulpprogramma Remove Empty Directories gebruiken.

Als alternatief kun je deze one-liner batch file gebruiken (van DownloadSquad ):

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

(indien gebruikt binnen een batch file, vervang dan %d door %%d)

Dit werkt omdat rd geen directory zal verwijderen die bestanden bevat.

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

U kunt ook ROBOCOPY gebruiken. Het is heel eenvoudig en kan ook gebruikt worden om lege mappen in een grote hiërarchie te verwijderen.

ROBOCOPY folder1 folder1 /S /MOVE

Hier zijn zowel bron als bestemming folder1, omdat je alleen lege mappen hoeft te verwijderen, in plaats van andere bestanden naar een andere map te verplaatsen. /S optie is om het kopiëren (verplaatsen, in het bovenstaande geval) van lege mappen over te slaan. Het is ook sneller omdat de bestanden worden verplaatst binnen dezelfde schijf.

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

Het gratis hulpprogramma EmptyFolderNuker doet dit prima, vanuit een basismap van uw keuze. Het verwijdert ook die mappen die alleen lege sub-mappen bevatten.

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

Geen van de vorige antwoorden werkte voor mij, dus heb ik het volgende bestand gemaakt:

EmptyDirectoriesRemove.cmd

Inhoud:

@setlocal enableextensions enabledelayedexpansion

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

endlocal

Gebruik: Cd naar de top level directory die je wilt opruimen. Voer vanaf de opdrachtregelprompt uit:

EmptyDirectoriesRemove.cmd

Er verschijnen waarschuwingen voor niet-lege mappen.

Gebruikelijke disclaimers: Gebruik op eigen risico. Maak een back-up voordat u gaat testen. etc.

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

Als je Cygwin geïnstalleerd hebt, zou je dit kunnen doen:

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

Hmmm… misschien een nog simpelere oplossing:

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

Start dit vanuit de map waarin je lege mappen verwijderd wilt hebben.

/d - werkt op mappen, niet op bestanden /r - recurseert subdirs

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

Door Gareth’s en G-Man’s berichten te combineren:

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

Edit: Maar dat gaf een beveiligingsfout vanwege ‘C’ in mijn PATH var…dus in plaats daarvan:

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

Ik gebruik xargs niet omdat het een invoerlimiet lijkt te hebben (van ongeveer 1024 regels, denk ik?), terwijl

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

gewoon doorgaat zolang het invoer heeft. Laat de ‘-v’ verbose vlag weg als je de resultaten niet wilt zien en/of het sneller wilt laten lopen.

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

De 4NT shell (tegenwoordig Take Command) heeft een /sx optie voor “DEL”. /S is recursief, de toegevoegde X is verwijder lege dirs.

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

Als je in emacs werkt (waardoor dit platform-agnostisch is), werkt het volgende:

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