Bash 用于删除超过n天的目录的Shell脚本
我的目录名为:Bash 用于删除超过n天的目录的Shell脚本,bash,shell,Bash,Shell,我的目录名为: 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 | xargs rm -rf find:用于查找文件/目录/链接等的unix命令 /path/to/base/di
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 | xargs rm -rf
:用于查找文件/目录/链接等的unix命令find
:开始搜索的目录/path/to/base/dir
:仅查找目录-键入d
-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 {} +
例如,如果要删除/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
我使用上面提供的脚本和其他一些脚本,特别是当文件和文件夹名有换行符或空格时,很难做到这一点
终于偶然发现了tmpreaper,到目前为止,它对我们来说已经非常有效了
tmpreaper -t 5d ~/Downloads
tmpreaper --protect '*.c' -t 5h ~/my_prg
原始来源
具有类似test的功能,它递归地检查目录并列出它们。
能够在删除时删除符号链接、文件或目录以及特定模式的保护模式或
rm -rf `find /path/to/base/dir/* -type d -mtime +10`
更新、更快的it版本:
find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f
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
和从下到上的删除。它们在实际创建/修改时间上有什么关系?因为find
可以在不查看名称的情况下执行此操作……他们也应该有创建/修改时间,您所说的“早于”是什么意思?您指的是创建目录的时间、上次更改目录内容的时间还是其他时间?注意下面的一些答案ctime
是inode更改时间。对于一个目录,当文件从目录中添加或删除时,它会发生更改。-mtime
对我来说更好,因为它检查内容更改而不是权限更改,否则这是完美的。我认为这也会删除基本目录itself@OrGal你完全正确。为了防止出现这种情况,只需使用:find/path/to/base/dir/*
。您可以使用-maxdepth 1忽略目录的内容。如果要删除的文件夹太多,则更有效的方法可能会适得其反:。出于同样的原因,为了避免删除基本文件夹,最好使用-mindepth 1
(而不是/path/to/folder/*
)。这一个很容易超过最大命令行长度。请参见xargs--show limits
。如果文件名中包含空格或其他特殊shell字符,则该命令也将不起作用。@ruttersmoker-print0
/-0
是否处理特殊shell字符?您是对的,xargs
版本将@mpen,但是第一行不行。我可以确认-delete
有效,但是就像你说的,你只能用它来删除空目录,就像rmdir
一样。