find 脚本应该在删除空目录中的文件后递归删除空目录

Atu*_*tul 4 linux find

我有这个查找脚本,它可以在 /home 目录中查找大小超过 100 MB 的文件,并在超过 10 天的情况下将其删除。它通过 cron 作业每天安排一次。

find /home/ -mtime +10 -type f -size +100M -delete >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

现在,我希望这个脚本从它删除文件的地方递归地删除目录,因为它会留下空目录。

任何人都可以建议或建议需要在此脚本中进行哪些更改?

Sté*_*las 6

在 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
Run Code Online (Sandbox Code Playgroud)

我们awk用来过滤掉重复项,同时仍然保持顺序(在它们所在的分支之前离开)并且还延迟打印,直到所有文件都被删除,以便rmdir可以删除空目录。

与zsh:

files=(/home/**/*(D.LM+100m+10od))
rm -f $files
rmdir ${(u)files:h}
Run Code Online (Sandbox Code Playgroud)

请注意,这些将删除在删除文件后变空的目录,但如果这些目录没有任何要删除的文件并由于目录被删除而变空,则不会删除这些目录的父目录。如果您也想删除它们,使用 GNU rmdir,您可以将-p/--parents选项添加到rmdir.

如果您想删除所有空目录,无论文件或目录是否已从它们中删除,仍然使用 GNU find,您可以执行以下操作:

 find /home/ \( -mtime +10 -type f -size +100M -o -type d -empty \) -delete
Run Code Online (Sandbox Code Playgroud)