如何递归清理父目录中的所有空文件和目录?
假设我有这个目录结构:
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
.
答案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$"