查找并删除超过 3 天的非空文件夹

查找并删除超过 3 天的非空文件夹

我想查找并删除超过 3 天的非空目录。

find . <Path> -mtime +3 -exec rm -rf "{}" \;

我想删除其中包含文件的目录,并且该目录和文件已超过 3 天。

/tmp
drwxr-x--- 2 root root 4096 Nov  6 05:05 20191106
drwxr-x--- 2 root root 4096 Nov  7 05:05 20191107
drwxr-x--- 2 root root 4096 Nov  8 05:05 20191108
drwxr-x--- 2 root root 4096 Nov  9 05:05 20191109
drwxr-x--- 2 root root 4096 Nov 10 05:05 20191110
drwxr-x--- 2 root root 4096 Nov 11 05:05 20191111
drwxr-x--- 2 root root 4096 Nov 12 05:05 20191112
drwxr-x--- 2 root root 4096 Nov 13 05:05 20191113
drwxr-x--- 2 root root 4096 Nov 14 05:05 20191114
drwxr-x--- 2 root root 4096 Nov 15 05:05 20191115
drwxr-x--- 2 root root 4096 Nov 16 05:05 20191116
drwxr-x--- 2 root root 4096 Nov 17 05:05 20191117
drwxr-x--- 2 root root 4096 Nov 18 05:05 20191118
drwxr-x--- 2 root root 4096 Nov 19 05:05 20191119

所以这里的时间超过3天。每个目录都有一些文本文件。

答案1

可能是这样的:

find . -mindepth 1 -maxdepth 1 -not -empty -type d -mtime +3 -exec rm -rf {} \;

touch此解决方案将删除超过三天未编辑的 1 级非空目录。

测试前请备份数据。

答案2

在shell 中,修改时间戳超过三天的zsh非空目录将与文件名通配模式匹配/tmp

/tmp/*(/DNFm+3)

glob 限定符的(/DNFm+3)意思是

  • 仅匹配目录(/;这不是严格需要的,因为F限定符意味着相同),
  • 允许匹配隐藏名称(D;dotglob与 中的 shell 选项类似bash),
  • 如果没有匹配则展开为空( ;与 中的 shell 选项N类似),nullglobbash
  • 仅包含“完整”(非空)目录 ( F),
  • 仅包含修改时间戳为严格地超过三天前(m+3;对于目录,这意味着在很多天前从目录中添加或删除了最后的内容;就像 for find's一样-mtime +3,这意味着4天或更老)。

要列出所有匹配项,请使用

print -rC1 -- /tmp/*(/DNFm+3)

要删除它们,请使用

rm -rf -- /tmp/*(/DNFm+3)

如果有数千个这样的匹配,并且您遇到了参数列表太长错误,然后使用循环:

for dirpath in /tmp/*(/DNFm+3); do
    rm -rf -- $dirpath
done

或者使用zargs

autoload zargs
zargs -- /tmp/*(/DNFm+3) -- rm -rf

或者启用rm内置函数zmodload zsh/files来解决execve()系统调用的限制。

相关内容