按时间清除回收站中的文件

ubuntu的nautilus在删除文件的时候,一般都是把文件移动到所属分区的.Trash目录下,如果[启用了libtrash](324),在shell中删除的文件也会被移动到$HOME/.Trash目录中,时间长了以后,这些.Trash目录的管理是个问题。

直接全部清空显然太简单,我习惯先清除最早删除的文件,以前是用php写了个脚本来作,现在发现使用find命令就完全能够实现了:

find . -mtime +200

这样所有“岁数”大于200天的文件就都找出来了,不过当前目录.也出来了,去掉它:

find . -mtime +200 ! -name "."

只输出文件名太简单,加上日期和文件大小的输出:

find . -mtime +200 ! -name "." -printf '%T+ %8kK %P\n'

这样就比较完美了,确定想删除这些文件的话,在最后带上-delete就可以了:

find . -mtime +200 ! -name "." -printf '%T+ %8kK %P\n' -delete

另外,如果想知道清除这些文件能够释放多少空余磁盘空间,可以借助awk来实现:

find . -mtime +200 ! -name "." -printf '%8k\n'|awk '{sum += $1}END{printf "Total %d K.\n", sum}'

在上面所有的find中,使用的都是mtime,也就是文件的最后修改时间,这样有一个小缺点,从网上下载的文件时间一般是服务器上的文件时间,虽然你是2007年下载的,文件的mtime可能会是2002年,这样的文件会被优先删除,不过无所谓了,既然是回收站,既然是从网上下载的,大不了再重新下去,保护我们自己“生产”的文件才是首要任务。

为何不用atime也就是最后访问时间,我觉得这个时间非常不靠谱,比如你用clamscan扫描完病毒之后,所有文件的atime都变成现在了,还有一些莫名的情况,总之不是很稳定,不如mtime让人放心,即使我删除了10天前编辑的文件,它的mtime就一直会是10天前的日期,不会再变的。

另外在实际的使用过程中,还会遇到另外一种情况,目录的日期比较早,而该目录下有比较新的文件,所以find的时候就只把目录find出来了,如果加上-delete,是不是就把目录删除了?下面那些比较新的文件也都没有了。所以我用这种方式解决:find的之后指定不搜索目录(! -type d),而在文件清除之后再按照同样的时间条件删除所有空目录(find . -type d -empty -mtime +200 -delete),减少文件被误删的可能。

基于上面那些,我写了一个简单的脚本方便调用,可从[这里](http://www.archive.org/details/clear_trash_by_time)下载,为了安全,限定只搜索当前目录,并且目录名称必须包含有“Trash”。

3 thoughts on “按时间清除回收站中的文件”

  1. 不错不错,第一步也可以直接用 -type f 判断;或者不用-delete用exec 套rm -f(只删文件不删目录)、rmdir (只删空目录不删文件)

    话说回来,ubuntu的这个修改感觉怪怪的~~~就像RH将rm 强制alias 为rm -i 一样,不舒服。。。

Leave a Reply

Your email address will not be published. Required fields are marked *