概括

概括

我有一个查找脚本,可以在 /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来调用。然后我们只查看目录,并且只查看那些非空的目录,从而防止删除原来为空的目录。-depthfindfind

相关内容