如何递归删除主目录中的空目录?

San*_*mar 224 linux filesystems find rm

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

我经常创建目录,分散在我的主目录中,我发现很难找到和删除它们。

我想要任何别名/函数/脚本来查找/定位并删除我的主目录中的所有空目录。

Bal*_*ick 420

find命令是递归文件系统操作的主要工具。使用-type d表达式告诉find您只对查找目录(而不是纯文件)感兴趣。GNU 版本find支持-empty测试,所以

$ find . -type d -empty -print
Run Code Online (Sandbox Code Playgroud)

将打印当前目录下的所有空目录。

使用find ~ -…find "$HOME" -…根据您的主目录进行搜索(如果它不是您的当前目录)。

在您确认这是选择正确的目录后,使用-delete删除所有匹配项:

$ find . -type d -empty -delete
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案,但需要注意的是,并非所有版本的 find 都有 `-empty`。 (6认同)
  • 考虑将第二个示例更改为 `.` 而不是 `~`。如果有人在没有注意到的情况下复制粘贴它并且只检查第一个的输出,这可能会产生不良后果。 (4认同)
  • 我会在这里添加 ```-mindepth 1```,以防止删除起始目录本身,如果它是空的。```$HOME``` 不是很可能的情况,但是如果你想在任何其他目录上使用它.. (2认同)

jor*_*anm 18

您可以调用rmdir每个目录,因为rmdir只有在目录为空时才会删除该目录:

find "$HOME" -type d -exec rmdir {} + 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

如果您还想打印被删除的目录,则需要检查它们是否为空:

find "$HOME" -type d -exec bash -c 'shopt -s nullglob; shopt -s dotglob; files=("$1"/*); [[ ${files[@]} ]] || rmdir -v "$1"' -- {} \; 
Run Code Online (Sandbox Code Playgroud)

这是一个纯 bash 示例(版本 4 或更高版本):

shopt -s globstar
for dir in **/; do
   files=("$dir"/*)
   [[ ${files[@]} ]] || rmdir -v "$dir"
done
Run Code Online (Sandbox Code Playgroud)

  • BusyBox `find` 没有 `-empty`,所以 `-exec` 技巧很有帮助。但是与其将错误发送到 /dev/null,不如告诉 rmdir 抑制它们,例如 `find 。-type d -depth -exec rmdir -p --ignore-fail-on-non-empty {} \;` (4认同)
  • @jlh 不,第一个命令只会执行一次 `rmdir`。这就是使用 `+` 和 `\;` 来终止 `find` 中的命令的区别。 (3认同)