我的目录名为:
2012-12-12
2012-10-12
2012-08-08
我如何使用bash shell脚本删除超过10天的目录?
ctime
是inode更改时间。对于目录,当在目录中添加或删除文件时,它会更改。
我的目录名为:
2012-12-12
2012-10-12
2012-08-08
我如何使用bash shell脚本删除超过10天的目录?
ctime
是inode更改时间。对于目录,当在目录中添加或删除文件时,它会更改。
Answers:
这将为您递归执行此操作:
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 {} +
-mtime
对我来说更好,因为它检查内容更改而不是权限更改,否则,这是完美的。
find /path/to/base/dir/*
。
-mindepth 1
(而不是/path/to/folder/*
)。
如果你想删除所有子目录下/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
并从下至上删除。
-delete
作品,但是就像您说的那样,您只能使用它来删除空目录,就像rmdir
。
要么
rm -rf `find /path/to/base/dir/* -type d -mtime +10`
更新,更快的版本:
find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f
xargs --show-limits
。
-print0
/ Carpetsmoker / 不-0
照顾特殊的shell字符吗?
xargs
版本将@mpen,但第一行则不会。
find
不用看名字就可以做到……