看着del和rmdir DOS命令,看起来您可以递归地执行此操作而不删除所有文件。有没有办法从命令行执行此操作?
#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
评论
我很惊讶没有这个问题的简单答案。@billpg:可能会很简单:xcopy FROMDIR TODIR / s。看到这样的答案:stackoverflow.com/a/14742810
XCOPY删除目录吗?
使用ROBOCOPY可以轻松完成。有关详细信息,请参见下面的答案。