Linux查找某个指定时间要求的文件

一、背景说明

项目上应用或者数据库服务器的存储空间基本是先定好的,随着时间的推移,应用服务产生的log日志或者数据库的归档日志都有可能存在撑爆磁盘空间的问题。鉴于此,对于应用日志之前有说过可以通过自动转储的方式来处理,这个方法用于归档日志就不太适合。为此我们常用的方法是准备一个专门的用于做存储的设备,例如华为云的OBS服务,来存储归档日志,这也是因为专门的OBS存储库会比添加磁盘的成本要便宜,也是异地存储,然后按照要求定时的将归档日志迁移到OBS存储库中。当然对于一些不重要的测试库来说可以定时的删除过期的归档日志,应用服务的日志也同样适用,为此我们用find命令来查找一定时间要求的日志文件来迁移或者删除,例如做个定时任务每天定时删除7天前的日志。

二、一些文件时间属性说明

1、atime、ctime、mtime区别

  • atime是指access time,指文件中的数据最后被访问的时间
  • ctime即change time文件状态改变时间,指文件的元数据发生变化的时间,比如权限、所有者等,通过chmod修改文件属性,ctime就会被修改。
  • mtime即modify time,指文件内容被修改的最后时间。

2、查看文件的时间等属性

  • 使用stat filename命令可以查看到这三个时间属性,有兴趣的可以自己创建一个文件,然后分别通过访问(如cat)、修改内容(echo >>)、修改属性(chmod)来测试这三个时间属性的变化情况

    [NOTE]
    与atime,ctime,mtime类似,以分钟为单位的时间范围查找对应的参数为amin,cmin,mmin。

三、查找指定时间要求的文件

先看下find --help的介绍

  • 查找某个时间段内的文件,例如查找2020-04-01到2020-04-13号之间的文件,使用如下命令即可:
    find /log/ -name 'test.log*' -newermt '2020-04-01' ! -newermt '2020-04-13'

  • 找出 3 天“以前”被改动过的文件(> 72 小时)
    find /var/log/ -mtime +3 -type f -print

  • 找出前 3 天內被改动过的文件(0 ~ 72 小时內)
    find /var/log/ -mtime -3 -type f -print

  • 找出前第 3 天被改动过的文件(72 ~ 96 小时)
    find /var/log/ -mtime 3 -type f -print
    find /var/log/ -mtime +2 -mtime -4 -type f -print

[NOTE]
+n 表示n天之前;-n 表示n天以内;n 表示第n天的时候。

四、实际应用

1、Linux查找某个时间内的文件并删除

/usr/bin/find /pg_backup/archive_wals -name "*.lz4" -mtime +35 |xargs rm -rf
/usr/bin/find /pg_backup/archive_wals -name "*.lz4" -mtime +35 -exec rm -rf {} \;
可以配合定时任务一起使用,其中 |xargs rm -rf-exec rm -rf {} \; 作用相似,即通过前面的条件查找出35天前的文件,将结果返回给后面的语句进行处理,即删除。前者是查出一条删除一条,后者是查出之后作为整体放到{}内进行删除,这样当文件数量较多的时候,就可能会出现“参数太多”之类的错误,建议一般选择前者。

[NOTE]
rm不接受标准输入,所以不能用find / -name "tmpfile" |rm 后面需要加-rf;
-exec必须由一个;结束,而因为通常shell都会对;进行处理,所以用\;防止这种情况。{}可能需要写做'{}',也是为了避免被shell过滤。

2、Linux查找某个时间内的文件并复制到指定目录

*/10 * * * * /usr/bin/find /u01/pgdata/12/archive_wals/ -name "*.lz4" -mmin -10 |xargs -I {} cp {} -u -t /obs-mountpoint/postgresql/backups/archive_wals/
每10分钟将前10分钟之内的文件cp到指定目录,其中 -u 表时cp时遇到相同文件更新替换,-t 复制所有的源文件到目录。

posted @ 2020-10-12 17:44  灬夜露沁心灬  阅读(15455)  评论(0编辑  收藏  举报