我有一个查找脚本,可以在 /home 目录中查找大小超过 100 MB 的文件,如果超过 10 天则将其删除。通过 cron 作业每天安排一次。
find /home/ -mtime +10 -type f -size +100M -delete >/dev/null 2>&1
现在,我希望此脚本从删除文件的位置递归删除目录,因为它留下空目录。
任何人都可以建议或建议此脚本需要进行哪些更改吗?
答案1
在 GNU 系统上,你可以这样做:
find /home/ -mtime +10 -type f -size +100M -delete -printf '%h\0' |
awk -v RS='\0' '!seen[$0]++ {out = out $0 RS}
END {printf "%s", out}' |
xargs -r0 rmdir
我们用来awk
过滤掉重复的文件,同时仍然保持顺序(在它们所在的分支之前离开),并延迟打印,直到所有文件都被删除,这样就rmdir
可以删除空目录。
和zsh
:
files=(/home/**/*(D.LM+100m+10od))
rm -f $files
rmdir ${(u)files:h}
请注意,这些将删除之后变空的目录文件将从其中删除,但如果它们没有任何要删除的文件并由于以下原因而变为空,则不会删除这些目录的父目录目录被移除。如果您也想删除这些,使用 GNU rmdir
,您可以将-p
/--parents
选项添加到rmdir
.
如果您想删除所有空目录,无论文件或目录是否已从中删除,仍然使用 GNU find
,您可以这样做:
find /home/ \( -mtime +10 -type f -size +100M -o -type d -empty \) -delete
答案2
您不能在之后的第二次运行中删除所有空目录(find
选项-empty
以及-type d
?
答案3
cd "/home" && \
find . -depth -type d ! -name . ! -empty -exec sh -c '
find "$1" -mtime +10 -type f -size +100M -delete
' {} {} \; -empty -delete
概括
我们需要 GNU find 才能使上述工作正常进行。基本思想是我们使用强制比父母更早处理子目录的模式find
来调用。然后我们只查看目录,并且只查看那些非空的目录,从而防止删除原来为空的目录。-depth
find
find