查找:抑制“目录不为空”

查找:抑制“目录不为空”

要删除上次修改时间超过 2 周前的所有非隐藏文件和目录,我使用:

find ~ -mindepth 1 -mtime +14 -name "[!.]*" -delete

这有时会打印错误消息“目录不为空”。

我想消除这些错误(因为我在作为 cronjob 运行时收到有关它们的通知),但我仍然想在find目录为空且超过 2 周时删除它们。

答案1

如果您find支持-maxdepth-delete非标准扩展,它可能也支持-empty,所以您可以这样做:

find ~ -mindepth 1 -mtime +14 ! -name '.*' \( ! -type d -o -empty \) -delete

(也就是说,仅尝试删除空目录)

请注意,这-delete意味着-depth(您希望在包含该文件的目录之前删除该文件)。

但是,从目录中删除文件会更新该目录的修改时间。这意味着如果目录包含已成功删除的旧文件,即使它们最初本身很旧,也不会被删除。

在这里,您可能不想删除任何目录:

find ~ -mtime +14 ! -name '.*' ! -type d -delete

或者在删除任何文件之前记录旧目录的列表,删除非目录文件,然后删除记录列表中的目录:

tmp=$(mktemp) &&
{
  rm -f -- "$tmp"
  find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0 >&3
  find ~ -mtime +14 ! -name '.*' ! -type d -delete
  xargs -r0 rmdir <&4 2> /dev/null
} 3> "$tmp" 4< "$tmp"

或者使用moreutils sponge(尽管这意味着将整个文件列表存储在内存中):

 find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0 |
   sponge sh -c '
     find ~ -mtime +14 ! -name ".*" ! -type d -delete
     xargs -r0 rmdir'

Orzsh=(...)过程替换形式:

{
  find ~ -mtime +14 ! -name ".*" ! -type d -delete
  xargs -r0 rmdir
} < =(find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0)

或者您可以删除所有空目录,无论它们是否旧:

find ~ -mindepth 1 ! -name '.*' \( -mtime +14 ! -type d -o -type d -empty \) -delete

相关内容