在Windows中递归删除空目录


93

我的Windows 7计算机上有一个目录,该目录具有数百个(如果不是数千个)子目录。其中有些文件,有些则没有。我要删除所有空目录。

查看del和rmdir DOS命令,您似乎可以递归地执行此操作而不删除所有文件。有没有办法从命令行执行此操作?


我很惊讶没有这个问题的简单答案。
billpg

@billpg:可能会很简单:xcopy FROMDIR TODIR /s。看到这样的答案:stackoverflow.com/a/14742810
eckes

1
XCOPY删除目录?
billpg

1
使用ROBOCOPY可以轻松完成。请参阅下面的详细信息。
Varun Sharma 2015年

Answers:


115

您可以使用“ 删除空目录”实用程序。

或者,您可以使用此单行批处理文件(来自DownloadSquad):

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

(如果在批处理文件中使用,请替换%d%%d

之所以rd可行,是因为不会删除包含文件的目录。


6
PS:我建议您先尝试使用基于GUI的工具,然后再尝试任何可能会删除所有文件的命令行命令。
caliban

1
确保它确实是空的。隐藏的desktop.ini仍被视为文件。与thumbs.db相同。如果要验证是否可行,请创建一个测试目录,其中的目录为空且已填充。我已经验证了,它有效。
caliban

1
是的 有用。我的错。
EBGreen

8
/ f%d in('dir / s / b')做rmdir“%d”应该工作,因为rmdir无法删除非空文件夹
seanyboy 2009年

1
查看stackoverflow.com/a/34025977/694360,了解如何将此功能添加到上下文菜单。
mmj 2015年

49

您也可以使用ROBOCOPY。这非常简单,还可以用于删除大型层次结构中的空文件夹。

ROBOCOPY folder1 folder1 /S /MOVE

这里的源和目标都是folder1,因为您只需要删除空文件夹,而不是将其他文件移动到其他文件夹。/S选项是跳过复制(在上述情况下移动)空文件夹。由于文件在同一驱动器内移动,因此速度也更快。


1
魔法。因此,这会将所有非空文件夹移动到它们已经位于的相同位置(是什么呢?),并跳过空文件夹?但是然后:为什么跳过它们会导致删除?而且这不会将嵌套文件夹移入folder1吗?可怕,除非经过良好测试。
Arjan 2015年

3
@Arjan我已经对其进行了测试,并且效果很好!要了解其工作原理,就像将所有文件移动到其他位置(空文件夹除外),然后删除左侧的空文件夹一样。/MOVE首先复制文件,然后在复制后删除源文件。因此,如/S所使用的,它将非空文件夹复制到目的地(在上述情况下为相同文件夹)。然后,它删除空白文件夹(例如,认为空白文件夹已被复制)。不,它不会将嵌套文件夹移动到folder1,因为ROBOCOPY会递归移动文件夹。
Varun Sharma 2015年

3
它甚至可以使用UNC路径(至少在win7上)!太棒了!
Arioch'The

2
这是一个非常优雅的解决方案,不需要任何第三方软件。谢谢!
马库斯·曼格斯多夫

1
这只是发挥了魔力,而且效果很好。谢谢!
CharleyDC5

15

由于Cygwin随附GNU find,因此您可以执行以下操作:

find . -type d -empty -delete

或为了避免文件夹不再存在时的噪音:

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

现在,也可以使用Windows 10 Bash完成此操作。
3

对于我的Windows 10安装,此(find . -type d -empty -delete)在命令提示符下失败,并显示以下错误:FIND: Parameter format not correct
ImpressTheNet Web Developer

7

免费的EmptyFolderNuker实用程序可以从您选择的基本文件夹中完成此操作。它还会删除那些仅包含空子目录的目录。


1
单行批处理文件对我不起作用(我收到错误“ %% d这一次是意外的。”),并且“删除空目录”程序将无法安装(在链接页面上说不是)仍与Windows 7兼容)。这个程序就像一个魅力。
凤凰城

1
正如user36580在下面所述,“您可能直接从命令行运行。在这种情况下,请将双
精度

1
我喜欢纯命令行版本,因为它允许您预览要删除的内容。您始终可以使用从命令行调用它"%~dp0\EmptyFolderNuker.exe" %cd%
Jeroen Wiert Pluimers 2014年

1
@ rob-kam“ EmptyFolderNuker”的URL不再可用。
PeterCo

@PeterCo谢谢,现在修复。
Rob Kam

0

如果安装了Cygwin,则可以执行以下操作:

find -type d -exec rmdir {} \;

4
不必要。那可能不会删除只有空子目录的目录。您可能必须扭转它。查找类型d -print0 | tac | xargs -0 rmdir
Ryan Thompson

我以前从不知道“ TAC”。真是太好了!
Anthony Giorgio

1
或使用。该选项告诉您执行诸如反转输出顺序之类的操作-它先进入最深的目录级别,然后再返回。find (starting-directory) -depth -type d ...-depthfind
G-Man

0

如果您在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)))))

...请告诉我,您不必为了在emacs中完成此操作而键入所有这些内容。
Hashim

1
@Hashim这个想法是您在init中定义了它,然后将其绑定到了一个键。从技术上讲,D如果我愿意的话,可以绑定它,但是由于我对此没有共同的需求,因此我只需要输入M-x *ded RETbam–done。(如果我确实确实必须每次都键入此内容,那是荒谬的,这是绝对正确的-幸运的是,情况并非如此。)
肖恩·阿雷德

足够公平,听起来似乎更合理。
Hashim

是否M-x *ded RET有任何的意义还是随机的?如果是后者,如何跟踪分配给您的所有快捷方式emacs?备忘录足够吗?还是您发现自己必须查抄它们?
Hashim

1
@Hashim *ded是完整功能名称的缩写*-delete-empty-directories。许多完成引擎(例如常春藤,我使用的引擎)都了解这种模糊匹配。至于要记住它们……我根本不必这样做。我定义的功能都是从此开始的,*因此如果它们未绑定到键,我可以轻松找到它们。否则,emacs本身会告诉我是否有调用该函数的更快方法。如果所有其他方法都失败了,那么总有apropos
肖恩·阿雷德

0

结合Gareth和G-Man的帖子:

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

编辑:但是由于在我的PATH变量中存在“ C”,因此产生了安全错误...

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

我不使用xargs,因为它似乎有一个输入行限制(我认为大约是1024行),而

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

只要有输入就一直持续下去。如果您不想看到结果和/或希望它运行得更快,请省去“ -v”详细标志。


0

嗯...也许更简单的解决方案:

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

从要删除空文件夹的文件夹开始。

/ d-适用于文件夹,不适用于文件/ r-递归子目录

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.