我想查找并删除超过 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
类似),nullglob
bash
- 仅包含“完整”(非空)目录 (
F
), - 仅包含修改时间戳为严格地超过三天前(
m+3
;对于目录,这意味着在很多天前从目录中添加或删除了最后的内容;就像 forfind
'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()
系统调用的限制。