可能的重复:如何删除子树中的所有空目录?





我经常创建目录,这些目录分散在我的主目录中,我发现很难找到和删除它们。 />我希望任何别名/函数/脚本都能找到/定位并删除主目录中的所有空目录。

评论

这不能回答您的问题,但是可以解决潜在的问题。我经常使用以下结构:WORK = $(mktemp -d)或cd $(mktemp -d)。当然,不要将需要保留的重要文件放在这些目录中。但是很可能您的系统已经过设置,可以自动使这些文件在一段时间后消失。

我在启动时将计算机安装了一个tmpfs ram驱动器到/ z /目录,并在那里进行所有临时工作。

#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