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节点号来识别不同的文件,文件名不过是这个文件其中的一个属性而已。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值