2012-12-13 137 views
110

旧目录我已经命名为目录:shell脚本删除N天

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

我怎么会删除早于10天,一个bash shell脚本的目录?

+0

要他们在他们的实际创建/修改时间裸露任何关系?因为'find'可以在不查看名称的情况下执行此操作...... – Wrikken

+0

他们应该在其上创建/修改时间 – bobsr

+3

“年龄大于”是什么意思?你指的是创建目录的时间,内容最后更改的时间,还是其他内容?请注意下面的一些答案; 'ctime'是inode更改时间。对于目录,当文件被添加或从目录中删除时,它会改变。 – ajk

回答

262

这将做到这一点递归您:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \; 

说明:

  • find:查找文件/目录/链接等
  • /path/to/base/dir UNIX命令:目录开始搜索英寸
  • -type d:only f IND目录
  • -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方法一样。

注意:另请参阅@ MarkReed关于首选使用现代版本find的评论。

+29

使用现代版本的'find',你可以用'+'替换''',它将为你执行'xargs'的调用,传递的文件数量与每个'exec'系统调用相同:''找 。 -type d -ctime +10 -exec rm -rf {} +' –

+0

感谢你们俩。我可以通过命令以某种方式传递父目录。 – bobsr

+0

@bobsr查看更新后的答案:开始搜索的基本目录被指定为find后的第一个参数。 –

26

如果你想删除/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 1ONLY比赛子目录下立即/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 
3

我挣扎着爬使用上面提供的脚本和其他一些脚本尤其是这权当文件和文件夹名称有新行或空格。

最后偶然发现了tmpreaper,到目前为止它已经很好地工作了。

tmpreaper -t 5d ~/Downloads 


tmpreaper --protect '*.c' -t 5h ~/my_prg 

原文出处link

有如测试,递归地检查目录,并列出它们的功能。 能够删除符号链接,文件或目录,也是保护模式一定的模式,同时删除

0

OR

rm -rf `find /path/to/base/dir/* -type d -mtime +10` 

更新,它的速度更快的版本:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f 
+1

这个很容易超过最大命令行长度。请参阅'xargs --show-limits'。 –

+1

如果有包含空格或其他特殊外壳字符的文件名,这也不起作用。 – Carpetsmoker

+0

@Carpetsmoker不是'-print0' /'-0'照顾特殊的外壳字符,或不是? – mpen

8

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并从底部删除。

+0

我可以确认'-delete'的作品,但正如你所说的,你只能用它来删除空目录,很像'rmdir'。 – CTodea