Answers:
亚历克西斯很近。您需要做的是:
find . -type d -depth -empty -exec rmdir "{}" \;
这将首先向下钻取目录树,直到找到第一个空目录,然后将其删除。因此,使父目录为空,然后将其删除,等等。这将产生所需的效果(我可能每周执行10次,所以我很确定这是正确的)。:-)
-depth
选择?find . -type d -empty -exec rmdir "{}" \;
应该也可以....对吗?
foo/bar/baz
。除非您使用-depth
,否则它将foo
首先尝试删除,然后失败,然后foo/bar
在运行后最终消失。
+
而不是,;
以便您批量删除目录。由于您是深度优先的,因此仍然会在父级之前删除子级(可能取决于您的rmdir / bash版本,并且依赖rmdir不会删除非空目录)。这对我在cygwin上的bash mkdir -p a/b/c/d ; find a -depth -type d -exec rmdir {} +
find ROOTDIR -type d -empty -delete
如同
find ROOTDIR -type d -depth -empty -exec rmdir "{}" \;
但使用内置的“-删除”操作。
注意,“-删除”表示“-深度”。
在安全地进行操作之前,有一些要求:
这是我在shell中的方法:
find ./ROOTDIR -type d | sort -r | tr '\n' '\000' | xargs -0 rmdir --ignore-fail-on-non-empty
如果您不介意一些多余的错误,则可以强制删除所有带有父目录的目录,而无需进行任何排序(您不能对NUL终止的字符串进行排序,这会增加tr的需要)
find ./ROOTDIR -type d -print0 | xargs -0 rmdir --ignore-fail-on-non-empty --parents
-empty -delete
选项之前,我可能会使用相同的方法find
。
rmdir $(find ROOTDIR -type d | sort -r)