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。它非常简单,也可以用来删除大型层次结构中的空文件夹。

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

结合Gareth和G-Man的帖子。

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

编辑:但由于我的PATH var中的'C',所以出现了安全错误……所以取而代之的是:

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

我不用xargs是因为它似乎有输入行数限制(我想是1024行吧?), 而

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

只要有输入就会一直运行. 如果你不想看到结果和/或希望它运行得更快,就不要使用’-v'verbose标志。

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

4NT的shell(现在的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)))))