Answers:
结合GNU find
选项和谓词,此命令应完成以下工作:
find . -type d -empty -delete
-type d
限制目录-empty
限制为空的-delete
删除每个目录这棵树是从树叶上走-depth
下来的,不需要指定,因为暗示了-delete
。
-delete
已经暗示,-depth
因此您无需手动指定。
-mindepth 1
此处添加内容,以防止删除起始目录本身(如果该目录为空)。
!
对外壳有特殊的含义。您需要逃脱它。像这样:\! -name 'Completed'
之前-delete
应该工作。或者,您只需将标记文件放在此目录中。
列出目录,最先嵌套。
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(请注意,重定向不仅适用于整个find
命令,还适用于整个命令rmdir
。仅针对进行重定向rmdir
会导致运行速度显着下降,因为您需要调用中间shell。)
您可以rmdir
通过传递-empty
查找谓词来避免在非空目录上运行。GNU find在将要运行命令时测试目录,因此将清空刚清空的目录。
find . -depth -type d -empty -exec rmdir {} \;
加快速度的另一种方法是对rmdir
调用进行分组。两者都可能比原始版本明显更快,尤其是在Cygwin的情况下。我预计这两者之间不会有太大区别。
find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null
哪种方法更快,取决于您拥有多少个非空目录。您不能-empty
与用于组合调用的方法结合使用,因为那样一来,仅包含空目录的目录在find
查看时就不会为空。
另一种方法是运行多次。这是否更快取决于很多因素,包括整个目录层次结构是否可以在find
两次运行之间保留在磁盘缓存中。
while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done
或者,使用zsh。该水珠预选赛 F
匹配非空目录,所以/^F
匹配空目录。仅包含空目录的目录很难匹配。
while rmdir **/*(/N^F); do :; done
(这在rmdir
收到空命令行时终止。)
-p
?我不会想到这会有所作为。
-empty
应该可以与此(尽管我不确定确切会获得多少)一起使用。而且非常非常琐碎,因为您可能不想删除.
,使用-mindepth 1
。
-depth
论点,这rmdir -p
毫无用处。我已经更改了我的评论。90年代是我最初的尝试;这里没有什么奇怪的。
rmdir
命令完全删除命令调用,至少使用GNU find:find . -depth -type d -empty -delete
find . -depth -type d -exec rmdir {} +
是对此问题最简单且符合标准的答案。
不幸的是,此处给出的其他答案都取决于并非所有系统上都存在的特定于供应商的增强功能。
find . -type d -printf "%d %p\n" |\
sort -nr |\
perl -pe 's/^\d+\s//;' |\
while read dir; do \
(rmdir "$dir" > /dev/null 2>&1); \
done
运作方式如下:
rmdir
由一个列表中的一个上我将这些别名用于常用find
命令,尤其是当我使用dupeguru清理磁盘空间时,删除重复项可能会导致很多空目录。
内部注释,.bashrc
因此以后需要调整时,我不会忘记它们。
# find empty directories
alias find-empty='find . -type d -empty'
# fine empty/zero sized files
alias find-zero='find . -type f -empty'
# delete all empty directories!
alias find-empty-delete='find-empty -delete'
# delete empty directories when `-delete` option is not available.
# output null character (instead of newline) as separator. used together
# with `xargs -0`, will handle filenames with spaces and special chars.
alias find-empty-delete2='find-empty -print0 | xargs -0 rmdir -p'
# alternative version using `-exec` with `+`, similar to xargs.
# {}: path of current file
# +: {} is replaced with as many pathnames as possible for each invocation.
alias find-empty-delete3='find-empty -exec rmdir -p {} +'
# for removing zero sized files, we can't de-dupe them automatically
# since they are technically all the same, so they are typically left
# beind. this removes them if needed.
alias find-zero-delete='find-zero -delete'
alias find-zero-delete2='find-zero -print0 | xargs -0 rm'
alias find-zero-delete3='find-zero -exec rm {} +'
rm -r */
命令对我来说很容易工作。rm
应该要求-f
强制删除包含文件的目录。rm -r
应该只删除空目录。我很乐意为什么这可能是错误的。这也应该留下文件,因为*/
仅查看文件夹。
rm
这主要是为了删除文件。虽然*/
只匹配目录,但我不知道它在更深层次上的作用。我也可以想象它仅在某些系统上有效。