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

moh*_*eem 17 linux shell bash

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

假设我有这个目录结构:

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

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

  |____ file1.txt
Run Code Online (Sandbox Code Playgroud)

我应该以这样的方式结束:

Parent/
  |____Child2/
        |_______ file21.txt

  |____ file1.txt
Run Code Online (Sandbox Code Playgroud)

Phi*_*ing 36

这是一个非常简单的单线:

find Parent -empty -delete
Run Code Online (Sandbox Code Playgroud)

这是相当不言自明的。虽然当我检查时,我很惊讶它成功删除了 Parent/Child1。通常,除非您指定-depth.

这有效是因为-delete暗示-depth. 请参阅GNU 查找手册

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


请注意,这些功能不是Posix 标准的一部分,但很可能在许多 Linux 发行版中都有。你可能有小的如高山Linux作为他们根据一个特定的问题Busybox的不支持-empty

那做其他系统包括非标准-empty-delete包括BSDOSX但显然不是AIX

  • 请记住,您引用的不是“find”手册,而是“gfind”手册。如果您确实描述了 `find` 的标准行为,那将没有问题,但是您的答案取决于两个非标准功能(`-empty` 和 `-delete`)。 (12认同)
  • man find:“-delete 操作也意味着-depth。” (2认同)

bxm*_*bxm 12

这是两个命令的解决方案

删除空文件

find Parent/ -type f -size 0 -delete
Run Code Online (Sandbox Code Playgroud)

尝试删除所有目录

find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

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

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

find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
  | grep -iv "Directory not empty$"
Run Code Online (Sandbox Code Playgroud)