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
  • find
    :用于查找文件/目录/链接等的unix命令
  • /path/to/base/dir
    :开始搜索的目录
  • -键入d
    :仅查找目录
  • >代码> cTime+10 :只考虑修改时间大于10天< /LI>的那些。
  • -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
一样。