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

Рекурсивное удаление пустых каталогов в Windows

У меня есть каталог на машине Windows 7, в котором есть сотни, если не тысячи подкаталогов. В некоторых из них есть файлы, в некоторых нет. Я хочу удалить все пустые каталоги.

Глядя на команду del и rmdir DOS, не похоже, что вы можете сделать это рекурсивно, не удаляя все файлы. Есть ли способ сделать это из командной строки?

Ответы (9)

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

Вы можете использовать утилиту Удалить пустые директории .

Или же вы можете использовать этот однолинейный пакетный файл (из DownloadSquad ):

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

(если используется внутри пакетного файла, замените %d на %%d)

Это работает, потому что rd не удалит директорию, содержащую файлы.

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

Вы также можете использовать РОБКОПИ. Она очень проста и может быть использована для удаления пустых папок внутри большой иерархии.

ROBOCOPY folder1 folder1 /S /MOVE

Здесь и источник, и место назначения - folder1, так как вам нужно удалять только пустые папки, вместо того, чтобы перемещать другие файлы в другую папку. Опция /S заключается в том, чтобы пропустить копирование (перемещение, в приведенном выше случае) пустых папок. Это также быстрее, так как файлы перемещаются внутри одного и того же диска.

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

Бесплатная утилита EmptyFolderNuker делает это отлично, из базовой папки по вашему выбору. Она также удаляет те каталоги, которые содержат только пустые подкаталоги.

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

Ни один из предыдущих ответов не помог мне, поэтому я сделал следующий файл:

EmptyDirectoriesRemove.cmd

Содержание:

@setlocal enableextensions enabledelayedexpansion

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

endlocal

Использование: Cd в каталог верхнего уровня, который вы хотите очистить. Из командной строки запустите:

EmptyDirectoriesRemove.cmd

Предупреждения появятся для непустых каталогов.

Обычные отказы от ответственности: Использовать на свой страх и риск. Резервное копирование перед тестированием и т.д.

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

Если у вас установлена Cygwin , вы можете это сделать:

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

Хм… может быть, еще более простое решение:

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

Начните с папки, которую вы хотите удалить пустые папки.

/d - будет работать с папками, а не с файлами /r - будут повторяться подкаталоги.

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

Объединяя посты Гарета и Джи-Мэна:

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

Правка: Но это дало ошибку безопасности из-за ‘C’ в моем PATH var….так что вместо этого:

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

Я не использую xargs, потому что, похоже, у него есть ограничение на входную строку (около 1024 строк, я думаю?), в то время как

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

просто продолжает работать до тех пор, пока у него есть входная строка. Оставьте флаг ‘-v’, если вы не хотите видеть результаты и/или хотите, чтобы он работал быстрее.

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

Оболочка 4NT (в настоящее время Take Command) имеет /sx опцию “DEL”. /S является рекурсивным, добавленный X удаляет пустые дирса.

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

Если вы работаете в emacs (делая эту платформу-диагностику), то это работает:

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

Похожие вопросы

3
19
10
28
5