如何递归删除 Linux 中的所有空文件和目录?

如何递归删除 Linux 中的所有空文件和目录?

如何递归清理父目录中的所有空文件和目录?

假设我有这个目录结构:

Parent/
  |____Child1/
        |______ file11.txt (empty)
        |______ Dir1/ (empty)

  |____Child2/
        |_______ file21.txt
        |_______ file22.txt (empty)

  |____ file1.txt

我应该这样结束:

Parent/
  |____Child2/
        |_______ file21.txt

  |____ file1.txt

答案1

这是一个非常简单的衬里:

find Parent -empty -delete

这是相当不言自明的。尽管当我检查时我很惊讶它成功删除了 Parent/Child1。通常,除非您指定,否则您会期望它先处理父级,然后再处理子级-depth

这是有效的,因为-delete意味着-depth.请参阅GNU 查找手册

-delete删除文件;如果删除成功则为 true。如果删除失败,则会发出错误消息。如果 -delete 失败,find 的退出状态将为非零(当它最终退出时)。使用 -delete 会自动打开 -deep 选项。


请注意,这些功能不属于POSIX标准,但很可能在许多 Linux 发行版下都会存在。对于较小的 Linux,例如 Alpine Linux,您可能会遇到特定问题,因为它们基于忙碌盒不支持-empty.

其他确实包括非标准系统-empty-delete包括BSD操作系统X但显然不是AIX

答案2

这是两个命令的解决方案

删除空文件

find Parent/ -type f -size 0 -delete

尝试删除全部目录

find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null

NBrmdir无法删除非空目录,因此运行是安全的,但会产生错误,我们将其隐藏

如上所述,但更具体地说明被忽略的错误消息。如果消息因发行版而异,则可能需要修改。

find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
  | grep -iv "Directory not empty$"

答案3

您还可以使用该fd工具执行此操作:

fd -t e -x rm -r

https://github.com/sharkdp/fd

相关内容