用于删除早于n天的目录的Shell脚本

时间:2012-12-13 21:30:19

标签: bash shell

我的目录名为:

2012-12-12
2012-10-12
2012-08-08

如何使用bash shell脚本删除超过10天的目录?

5 个答案:

答案 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