linux文件系统时间和find使用
Unix文件系统保存了文件的多个时间。这意味着你可以使用这些时间来进行查找,当任何文件或目录被访问(读或者写),改变(文件权限被更改)或者修改(被写入).
Unix系统中每个文件有三个时间:
- access time: atmie
- change time: ctime
- modify time: mtime
有意思的是,在大多数系统中并没有文件创建时间–这意味着你不能够写出这样一个命令【显示在某个具体日期创建的所有文件】。从ctime和mtime做出推断也能获取文件创建时间,如果他们两个相同,通常意味着那就是文件创建时间。
atime - Last Access Time
atime显示文件最后一次被访问的时间,被Unix进程或这命令行、脚本所访问。
根据定义,atime必须被更新-意味着写入磁盘-每次一个文件被方位,即使只是一个读操作(这里是说每次atime被更新时,这个atime作为文件的一个属性,要被保存下来,也会被写入磁盘)。在极端加载情况下,atime的要求能够严重的影响文件系统的表现,尤与固态硬盘相比,机械硬盘影响更严重(这里是说由于每次文件被访问都要写入磁盘,因此影响文件系统的性能,与固态硬盘相比,机械硬盘的影响更为严重)。
现代的Unix或类Unix系统有特殊的mount挂载选项来优化atime的使用(或者完全禁用atime)。
例如,在linux内核中,当进行挂载时,支持下面的优化:
- strictatime: 总是更新atime(不再是默认选项!)
- relatime(relative atime): 可选的atime更新,通常如果之前的atime是一个比ctime和mtime更早的时间则更新
- nodiratime: 对于目录的atime不更新(文件的atime仍然更新)
- noatime: 所有的atime都不更新
ctime - Last Change Time
ctime显示的是文件或目录的元数据修改时间,最典型的是文件的所属权(用户或组)和访问权限。ctime也会在文件内容修改时做出更新。
ps: 文件内容也属于文件的元数据?
mtime - Last Modification Time
mtime展示最后一次对文件内容做出改变的时间。当文件所属和权限修改时它不会改变,因此它被用来追踪文件内容本身的变化。
有意思的是,当一个文件或目录被创建时,通常三个时间都被设置为当前时间。
如何使用atime, ctme和mtime
许多常规的系统任务能够有所帮助,也能使用atime,ctime和mtime 的属性:
- 查找在某个具体日期更新的文件
- 确认一个配置文件的最后更新时间
- 查找前一个小时或前一天修改的文件-对于查找大多数的最近更新的log文件非常有用
- 核实一个具体的文件是否被访问,何时被访问–当debug一个脚本时很有用
- 快速获取一些旧文件(超过30天还未更新过)
- 确认目录何时更新-能够暗示出临时文件被创建和快速删除,因此当他们仍在目录中时不必查找文件
- 查看一系列文件来确认他们的所属权被改变,如果这个时间和mtime不同。这对于查看文件安全系统很有用
使用ls查看atime,ctime和mtime
ls -l : 查看mtime
ls -lu: 查看atime
ls -lc: 查看ctime
使用stat查看
gw1@gw1-PC:~/test_time$ stat aa.txt
文件:aa.txt
大小:3 块:8 IO 块:4096 普通文件
设备:805h/2053d Inode:4983299 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 1000/ gw1) Gid:( 1000/ gw1)
最近访问:2021-12-20 10:11:09.694843663 +0800
最近更改:2021-12-20 10:11:09.694843663 +0800
最近改动:2021-12-20 10:11:09.702843594 +0800
创建时间:-
使用find根据时间查找
- amin n: 文件n分钟前被访问
- atime n: 文件n*24小时前被访问。当find计算文件最后被访问经历了多少个24小时的周期时,小数部分被忽略,因此-atime + 1表示文件至少两天前被访问。
cmin、ctime、mmin、mtime和上面类似。
计算时间差:(当前时间-之前时间)/24, 不保留小数点。
数字n的表示:
+n 大于n
-n 小于n
n 正好为n
即将计算时间差结果和n进行比较:
- +n时,表示取计算结果大于n的文件,则表示文件时间在n天之前
- -n时,表示取计算结果小于n的文件,则表示文件时间在n天之内
- n时,表示计算结果刚好等于n的文件,表示文件时间距离今天刚好为n
例如10号8点创建一个文件,11号8点01分查看时,时间差为1,使用1刚好捕获到,表示捕获的是过去时间差天数结果为1(即24小时到48小时之间)。如果用+1,则表示计算结果大于1,表示48小时之前的文件。如果用-1表示计算结果小于1,表示距今0~24小时,也可以用-atime 0表示。
举例:
假如现在是8点,要获取修改时间在昨天8点之后的文件(也就是距今不超过24小时)
find . -mtime 0 或者 find . -mtime -1
要获取距今在24~48小时之内的文件(也就是距今1天到两天以内的文件):
find . -mtime 1
要获取距今超过48小时的文件(也就是距今超过2天)
find . -mtime +1
find的一些用法
忽视某些目录
# 形式: 在查找目录后紧跟-path xxx目录 -prune -o
find /data/web/ssy/online/* -path /data/web/ssy/online/tmp -prune -o
注意:
1)"-maxdepth 0" 表示只查找到/data/web/ssy/online下的目录。如果是"-maxdepth 1"则表示查找到/data/web/ssy/online/xxx下的目录
2)find命令中的过滤、忽略、排除使用"-path 过滤的文件或目录-prune -o “,其中-prune类似于if判断,如果-prune之前的语句为真,比如找到了
前面-path指定的/data/web/ssy/online/tmp目录,就不再执行后面-o跟的语句了,如果没有找到则执行后面的语句。这样就做到了排除效果!
其中的”-o" 是 “-or” 的意思!
3)-path要过滤掉的文件或目录路径参数一定要紧跟在要搜索的路径之后,否则过滤效果就不会实现!!也就是说上面的"-path /data/web/ssy/online/tmp"
必须紧跟着放在"/data/web/ssy/online/*"后面,否则查找时就不会过来掉/data/web/ssy/online/tmp这个目录。
删除乱码文件
$ ls -i #找到乱码文件的i节点号
1703907 ç¼?ç¨?ç? ç??é«?æ¸?pdfç??.pdf
$ find ./ -inum 1703907 -exec rm {} \; #或者使用-delete参数
关于find命令用法,可参考《find命令高级用法》。这种通过i节点号进行删除的方式适用于前面所提到的任何类型文件。
这里扩展说几句。在操作系统中,它是如何识别一个文件的呢?它并不是通过文件名,而是通过一个iNode号,即i节点号来识别不同的文件,文件名不过是这个文件其中的一个属性而已。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?