我的目录名为:
2012-12-12
2012-10-12
2012-08-08
如何使用bash shell脚本删除超过10天的目录?
答案 0 :(得分:336)
这将为您递归:
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 {} +
答案 1 :(得分:35)
如果要删除/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
答案 2 :(得分:13)
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
并从下往上删除。
答案 3 :(得分:3)
我正在努力使用上面提供的脚本以及其他一些脚本来解决这个问题,特别是当文件和文件夹名称有换行符或空格时。
最后偶然发现了tmpreaper,到目前为止我们的工作效果还不错。
tmpreaper -t 5d ~/Downloads
tmpreaper --protect '*.c' -t 5h ~/my_prg
原始来源link
具有test之类的功能,它以递归方式检查目录并列出它们。 能够在删除时删除符号链接,文件或目录以及特定模式的保护模式
答案 4 :(得分:1)
OR
rm -rf `find /path/to/base/dir/* -type d -mtime +10`
更新,更快版本:
find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f