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

Recursywne usuwanie pustych katalogów w systemie Windows

Mam katalog na mojej maszynie z systemem Windows 7, który ma setki, jeśli nie tysiące podkatalogów. Niektóre z nich mają pliki, niektóre nie. Chcę usunąć wszystkie puste katalogi.

Patrząc na polecenia del i rmdir DOS, nie wygląda na to, że można to zrobić rekursywnie bez usuwania wszystkich plików. Czy istnieje sposób, aby zrobić to z linii poleceń?

Odpowiedzi (9)

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

Możesz użyć narzędzia Usuń puste katalogi .

Alternatywnie możesz użyć tego jednolinijkowego pliku wsadowego (z DownloadSquad ):

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

(jeśli używasz wewnątrz pliku wsadowego, zastąp %d przez %%d)

To działa, ponieważ rd nie usunie katalogu, który zawiera pliki.

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

Możesz również użyć ROBOCOPY. Jest to bardzo proste i może być również użyte do usuwania pustych folderów wewnątrz dużej hierarchii.

ROBOCOPY folder1 folder1 /S /MOVE

Tutaj zarówno źródło jak i miejsce docelowe są folder1, ponieważ potrzebujesz tylko usunąć puste foldery, zamiast przenosić inne pliki do innego folderu. Opcja /S polega na pominięciu kopiowania (przenoszenia, w powyższym przypadku) pustych folderów. Jest to również szybsze, ponieważ pliki są przenoszone w obrębie tego samego dysku.

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

Darmowe narzędzie EmptyFolderNuker robi to dobrze, z wybranego przez ciebie folderu bazowego. Usuwa również te katalogi, które zawierają tylko puste podkatalogi.

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

Żadna z poprzednich odpowiedzi nie działała dla mnie, więc zrobiłem następujący plik:

EmptyDirectoriesRemove.cmd

Zawartość:

@setlocal enableextensions enabledelayedexpansion

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

endlocal

Użycie: Cd do katalogu najwyższego poziomu, który chcesz wyczyścić. Z wiersza poleceń, uruchom:

EmptyDirectoriesRemove.cmd

W przypadku niepustych katalogów pojawią się ostrzeżenia.

Zwykłe ostrzeżenia: Używaj na własne ryzyko. Wykonaj kopię zapasową przed testowaniem. itd.

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

Jeśli masz zainstalowanego Cygwin , możesz zrobić tak:

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

Hmmm… może jeszcze prostsze rozwiązanie:

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

Uruchom to z folderu, z którego chcesz, aby puste foldery były usuwane.

/d - będzie działać na folderach, nie na plikach /r - będzie rekurencyjnie przeszukiwać podkatalogi

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

Łącząc posty Garetha i G-Mana:

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

Edycja: Ale to dało błąd bezpieczeństwa z powodu ‘C’ w moim PATH var…więc zamiast tego:

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

Nie używam xargs, ponieważ wydaje się, że ma limit linii wejściowej (z około 1024 linii, jak sądzę?), Podczas gdy

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

po prostu kontynuuje tak długo, jak długo ma dane wejściowe. Pomiń flagę ‘-v’ verbose, jeśli nie chcesz widzieć wyników i/lub chcesz, żeby działał szybciej.

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

Powłoka 4NT (obecnie Take Command) ma opcję /sx do “DEL”. /S jest rekursywne, dołączony X to usuwanie pustych katalogów.

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

Jeśli pracujesz w emacsie (co czyni tę kwestię niezależną od platformy), działa następująca procedura:

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