可能的重复:如何删除子树中的所有空目录?
我经常创建目录,这些目录分散在我的主目录中,我发现很难找到和删除它们。 />我希望任何别名/函数/脚本都能找到/定位并删除主目录中的所有空目录。
#1 楼
find
命令是递归文件系统操作的主要工具。使用
-type d
表达式告诉find
您只想查找目录(而不是普通文件)。 GNU版本的find
支持-empty
测试,因此$ find . -type d -empty -print
将打印当前目录下的所有空目录。将搜索基于您的主目录(如果不是当前目录)。
确认这是正确的目录后,请使用
find ~ -…
删除所有匹配项:$ find . -type d -empty -delete
评论
好的解决方案,但应注意,并非find的所有版本都具有-empty。
–jordanm
2012年8月25日在21:49
如果我以〜/ Desktop的形式运行,则@Baldrick不会从主目录中查找。
– Santosh Kumar
2012年8月25日在21:58
@Santosh:该命令实际上是从您的主目录运行的(这就是为什么我在开头添加〜$的原因)。如果要在任何工作目录下都运行它,请使用“ $ HOME”代替。正如乔丹在回答中所建议的。
–巴尔德里克
2012年8月25日在22:09
考虑将第二个示例更改为。代替〜。如果有人不加注意地复制粘贴了此内容,而仅检查第一个的输出,则可能会造成严重的后果。
–弗洛里安·温德尔伯恩(Florian Wendelborn)
16年3月3日在1:28
我将在此处添加-mindepth 1,以防止删除启动目录本身(如果该目录为空)。 $ HOME确实不是这种情况,但是如果您要在其他任何目录上使用它。
– Greg Dubicki
16年8月20日在12:46
#2 楼
您可以在每个目录上调用rmdir
,因为rmdir
仅会在目录为空的情况下删除该目录:需要检查是否为空:find "$HOME" -type d -exec rmdir {} + 2>/dev/null
这是一个纯bash示例(版本4或更高版本):
find "$HOME" -type d -exec bash -c 'shopt -s nullglob; shopt -s dotglob; files=(""/*); [[ ${files[@]} ]] || rmdir -v ""' -- {} \;
评论
如果我只想查找/定位而不删除,该怎么办?
– Santosh Kumar
2012年8月25日在21:44
@Santosh-在最后两个示例中,只需将rmdir -v更改为echo。
–jordanm
2012年8月25日在21:47
BusyBox查找没有-empty,因此-exec技巧很有帮助。但是比将错误发送到/ dev / null更好,最好是告诉rmdir抑制它们,例如找 。 -类型d -depth -exec rmdir -p --ignore-fail-on-non-empty {} \;
–罗伯特·卡尔洪(Robert Calhoun)
2015年4月1日在19:19
这些命令的性能很差,因为它们为找到的每个目录创建一个新进程。当使用这种方法时,您实际上至少应该使用诸如find ... |这样的方法。 xargs -n 100 rmdir批量删除它们。即使这样,它仍无法正常工作,因为它将无法删除早期目录,而由于后来删除了空目录,该目录后来将变为空目录。因此,您需要执行几次。
– jlh
2015年11月13日下午13:25
@jlh不,第一个命令将只执行一次rmdir。那是使用+和\;的区别。用于终止查找命令。
–jordanm
2015年11月13日在14:10
评论
这不能回答您的问题,但是可以解决潜在的问题。我经常使用以下结构:WORK = $(mktemp -d)或cd $(mktemp -d)。当然,不要将需要保留的重要文件放在这些目录中。但是很可能您的系统已经过设置,可以自动使这些文件在一段时间后消失。我在启动时将计算机安装了一个tmpfs ram驱动器到/ z /目录,并在那里进行所有临时工作。