Shell脚本删除n天以上的目录


165

我的目录名为:

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

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


1
与他们的实际创建/修改时间没有关系吗?因为find不用看名字就可以做到……
Wrikken 2012年

他们也应该在上面有创建/修改的时间
bobsr 2012年

4
“比…大”是什么意思?您是指目录的创建时间,目录的上次更改时间还是其他?请注意以下一些答案;ctime是inode更改时间。对于目录,当在目录中添加或删除文件时,它会更改。
2014年

Answers:


389

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

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 {} +

12
-mtime对我来说更好,因为它检查内容更改而不是权限更改,否则,这是完美的。
quickshiftin

7
我认为这也会删除基本目录本身
或Gal 2014年

3
@OrGal,您绝对正确。为了防止这种情况,只需使用:find /path/to/base/dir/*
zloynemec 2015年

11
您可以使用-maxdepth 1来忽略目录的内容
Sam

7
如果要删除的文件夹太多,则更有效的方法可能适得其反:stackoverflow.com/questions/11289551/…。出于相同的原因,为了避免删除基本文件夹,最好使用-mindepth 1(而不是/path/to/folder/*)。
Ohad Schneider

41

如果你想删除所有子目录下/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/base10天之前的所有子目录;

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

19

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并从下至上删除。


我可以确认其-delete作品,但是就像您说的那样,您只能使用它来删除空目录,就像rmdir
CTodea

3

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

最终偶然发现了tmpreaper,到目前为止,它对我们来说已经很好地工作了。

tmpreaper -t 5d ~/Downloads


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

原始来源链接

具有诸如test的功能,该功能可递归检查目录并列出目录。删除时可以删除符号链接,文件或目录以及某些模式的保护模式


2

要么

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

更新,更快的版本:

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

2
这很容易超过最大命令行长度。请参阅xargs --show-limits
Michael Krupp

2
如果文件名包含空格或其他特殊的shell字符,也将不起作用。
Martin Tournoij

@ -print0/ Carpetsmoker / 不-0照顾特殊的shell字符吗?
mpen

您是对的,该xargs版本将@mpen,但第一行则不会。
马丁·图尔诺伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.