我的目录命名为:
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
:用于查找文件/目录/链接等的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
,您可以替换;
with +
,它会为您执行等效的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
但是你不想删除 root /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
相反,它自下而上暗示和删除。
我正在努力使用上面提供的脚本和其他一些脚本来解决这个问题,特别是当文件和文件夹名称有换行符或空格时。
终于偶然发现了 tmpreaper,到目前为止它对我们来说效果很好。
tmpreaper -t 5d ~/Downloads
tmpreaper --protect '*.c' -t 5h ~/my_prg
原始来源链接
具有像测试这样的功能,它递归地检查目录并列出它们。能够删除符号链接、文件或目录,以及删除时特定模式的保护模式
或者
rm -rf `find /path/to/base/dir/* -type d -mtime +10`
更新,更快的版本:
find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f