我的目录名为:
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
/path/to/base/dir
-type d
-ctime +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方法。
-exec
使用现代版本的find,你可以用+替换;,它将为你执行与xargs调用等效的操作,在每次exec系统调用中传递尽可能多的文件:
+
;
xargs
find . -type d -ctime +10 -exec rm -rf {} +
例如,如果你想删除/path/to/base下的所有子目录
/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
-maxdepth 1
-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
/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这样的特性,它递归地检查目录并列出它们。 能够删除符号链接,文件或目录,以及某些模式的保护模式,同时删除
或
rm -rf `find /path/to/base/dir/* -type d -mtime +10`
更新的,更快的版本:
find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f
find支持-delete操作,因此:
-delete
find /base/dir/* -ctime +10 -delete;
我认为这里有一个陷阱,即文件也需要10天以上的时间。还没试过,有人可以在评论里确认。
这里投票最多的解决方案是缺少-maxdepth 0,因此它将在删除每个子目录后调用rm -rf。这说不通,所以我建议:
-maxdepth 0
rm -rf
find /base/dir/* -maxdepth 0 -type d -ctime +10 -exec rm -rf {} \;
上面的-delete解决方案没有使用-maxdepth 0,因为find会抱怨dir不是空的。相反,它暗示-depth并从下向上删除。
-depth