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

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

评论

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

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

XCOPY删除目录吗?

使用ROBOCOPY可以轻松完成。有关详细信息,请参见下面的答案。

#1 楼

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

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

在批处理文件中使用时,请将%d替换为%%d

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

评论


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

– Caliban
09年9月11日13:50

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

– Caliban
09年9月11日在18:19

是的有用。我的错。

–EBGreen
09年9月11日在18:27

/ f%d在('dir / s / b')中执行rmdir“%d”应该工作,因为rmdir无法删除非空文件夹

–seanyboy
09-09-16 13:14

只是警告,此脚本也会破坏目录连接。我经过惨痛的教训才学到这个。

–刻纹
16年5月22日在15:56

#2 楼

您也可以使用ROBOCOPY。这非常简单,还可以用于删除较大层次结构中的空文件夹。 ,而不是将其他文件移动到其他文件夹。 folder1选项是跳过复制(在上述情况下移动)空文件夹。由于文件在同一驱动器内移动,因此速度也更快。

评论


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

– Arjan
15年9月13日在11:15

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

–Varun Sharma
2015年9月13日19:56



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

– Arioch'The
2015年10月15日14:11

这是一个非常优雅的解决方案,不需要任何第三方软件。谢谢!

–马库斯·曼格斯多夫(Marcus Mangelsdorf)
17年12月28日在20:20

这只是发挥了它的魔力,并且完美地工作了。谢谢!

– CharleyDC5
19年4月23日在14:36

#3 楼

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

find . -type d -empty -delete


或者当文件夹不再存在时避免噪音:

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


评论


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

–何三月
17-10-7在19:06



对于我的Windows 10安装,此(查找。-type d -empty -delete)在命令提示符下失败,并出现以下错误:FIND:参数格式不正确

– ImpressTheNet Web开发人员
18年1月4日在22:39

它也可以在Git Bash中使用

–caot
20年9月4日在15:54

#4 楼

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

评论


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

–凤凰城
2010-3-7在11:52

如user36580在下面所述,“您可能直接从命令行运行。在这种情况下,请将双精度%%更改为单个%”

–拉克兰(Lachlan McD)。
2012年7月15日在3:27

我喜欢纯命令行版本,因为它允许您预览要删除的内容。您始终可以从命令行使用“%〜dp0 \ EmptyFolderNuker.exe”%cd%来调用它。

– Jeroen Wiert Pluimers
2014年12月27日14:30



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

– PeterCo
19年8月9日在8:13

@PeterCo谢谢,现在修复。

–罗布·金(Rob Kam)
19年8月12日在19:49

#5 楼

嗯...甚至更简单的解决方案:

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

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

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

#6 楼

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

find -type d -exec rmdir {} \;


评论


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

– Ryan C. Thompson
09-09-11 22:56

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

–安东尼·乔治(Anthony Giorgio)
09年9月12日在1:52

或使用find(起始目录)-depth -type d .... -depth选项告诉find进行诸如反转输出顺序之类的操作-它首先进入最深的目录级别,然后向上工作。

– G-Man说“恢复莫妮卡”
2015年6月21日在3:35



#7 楼

如果您正在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中完成此操作而键入所有这些内容。

–普罗米修斯
16 Dec 31'0:56

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

– Sean Allred
17年1月1日在7:33

公平地说,听起来更合理。

–普罗米修斯
17年1月1日在22:30

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

–普罗米修斯
17年1月1日在22:32

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

– Sean Allred
17年1月2日,2:10

#8 楼

结合Gareth和G-Man的帖子:

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


编辑:相反:

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


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

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


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

#9 楼

先前的答案对我都不起作用,因此我制作了以下文件:

EmptyDirectoriesRemove.cmd


内容: />用法:将CD复制到您要清除的顶层目录中。在命令行提示符下,运行:


EmptyDirectoriesRemove.cmd


警告将显示非空目录。

免责声明:使用风险自负。测试前备份。等

#10 楼

4NT外壳程序(现为Take Command)在/ DEL中有一个/ sx选项。 / S是递归的,附加的X是删除空目录。

#11 楼

您可以使用Powershell:
Get-ChildItem "Path" -recurse | 
  Where-Object {($_.PSIsContainer -eq $true) -and ((gci $_.fullName).count -eq 0)} | 
    Remove-Item -Force