用于删除超过 n 天的目录的 shell 脚本



我有名为:

2012-12-12
2012-10-12
2012-08-08

如何使用 bash shell 脚本删除超过 10 天的目录?

这将以递归方式为您完成:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} ;

解释:

  • find:用于查找文件/目录/链接等的unix命令。
  • /path/to/base/dir :开始搜索的目录。
  • -type d:仅查找目录
  • -ctime +10:只考虑修改时间超过10天的修改时间
  • -exec ... ; :对于找到的每个此类结果,在...中执行以下命令
  • rm -rf {}:递归强制删除目录;{}部分是查找结果从前一部分替换到的地方。

或者,使用:

find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf

这更有效一些,因为它相当于:

rm -rf dir1 dir2 dir3 ...

而不是:

rm -rf dir1; rm -rf dir2; rm -rf dir3; ...

就像在-exec方法中一样。


使用现代版本的 find ,您可以将;替换为 +,它将为您执行相当于xargs调用的操作,在每个 exec 系统调用中传递尽可能多的文件:

find . -type d -ctime +10 -exec rm -rf {} +

如果要删除/path/to/base下的所有子目录,例如

/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3

但是您不想删除根/path/to/base,您必须添加-mindepth 1-maxdepth 1选项,这些选项将仅访问/path/to/base下的子目录

-mindepth 1从匹配项中排除根/path/to/base

-maxdepth 1 只会匹配紧靠/path/to/base的子目录,例如 /path/to/base/dir1/path/to/base/dir2/path/to/base/dir3,但它不会以递归方式列出这些子目录。因此,将不会列出这些示例子目录:

/path/to/base/dir1/dir1
/path/to/base/dir2/dir1
/path/to/base/dir3/dir1

等等。

因此,要删除/path/to/base下超过 10 天的所有子目录;

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf

find支持-delete操作,因此:

find /base/dir/* -ctime +10 -delete;

我认为有一个问题,即文件也需要早 10+ 天。没有尝试过,有人可能会在评论中确认。

这里投票最多的解决方案缺少-maxdepth 0因此它将在删除每个子目录后调用rm -rf。这没有意义,所以我建议:

find /base/dir/* -maxdepth 0  -type d -ctime +10 -exec rm -rf {} ;

上面的-delete解决方案不使用-maxdepth 0,因为find会抱怨目录不为空。相反,它意味着自下而上的-depth和删除。

我正在努力使用上面提供的脚本和其他一些脚本来做到这一点,尤其是当文件和文件夹名称有换行符或空格时。

最后偶然发现了tmpreaper,到目前为止,它对我们来说效果很好。

tmpreaper -t 5d ~/Downloads

tmpreaper  --protect '*.c' -t 5h ~/my_prg

原始源链接

具有 test 等功能,可以递归检查目录并列出它们。能够删除符号链接,文件或目录,以及在删除时特定模式的保护模式

rm -rf `find /path/to/base/dir/* -type d -mtime +10`

更新,更快的版本:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f

相关内容

  • 没有找到相关文章

最新更新