193

我的目录命名为:

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

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

4

5 回答 5

448

这将为您递归地执行此操作:

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,您可以替换;with +,它会为您执行等效的xargs调用,传递适合每个 exec 系统调用的尽可能多的文件:

find . -type d -ctime +10 -exec rm -rf {} +
于 2012-12-13T21:44:01.760 回答
52

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

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

但是你不想删除 root /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
于 2013-09-12T15:10:24.817 回答
26

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相反,它自下而上暗示和删除。

于 2016-05-10T08:45:11.513 回答
3

我正在努力使用上面提供的脚本和其他一些脚本来解决这个问题,特别是当文件和文件夹名称有换行符或空格时。

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

tmpreaper -t 5d ~/Downloads


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

原始来源链接

具有像测试这样的功能,它递归地检查目录并列出它们。能够删除符号链接、文件或目录,以及删除时特定模式的保护模式

于 2014-02-20T11:21:34.150 回答
3

或者

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

更新,更快的版本:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f
于 2014-07-31T11:10:16.510 回答