我的目录名为:

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

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


当前回答

以删除“/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从匹配中排除根/路径/到/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 /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;

解释:

查找:用于查找文件/目录/链接等的Unix命令。 /path/to/base/dir:开始搜索的目录。 -type d:只查找目录 -ctime +10:只考虑修改时间大于10天的 -……对于发现的每一个这样的结果,在…中执行以下命令。 Rm -rf{}:递归强制删除目录;{}部分是find结果被替换到前一部分的地方。


另外,使用:

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从匹配中排除根/路径/到/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

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

最后偶然发现了tmpreaper,到目前为止,它已经为我们工作得很好。

tmpreaper -t 5d ~/Downloads


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

源链接

具有像test这样的特性,它递归地检查目录并列出它们。 能够删除符号链接,文件或目录,以及保护模式的某些模式,而删除

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会抱怨dir不是空的。相反,它意味着-depth并从下向上删除。

OR

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

更新的,更快的版本:

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