在Linux中没有文件创建时间的概念,只有文件的访问时间、修改时间、状态改变时间,也就是说不知道文件的创建时间。但如果文件创建后就没有修改过修改时间就等于创建时间,如果文件创建后状态就没有改变过,那么状态改变时间就等于创建时间,如果文件创建后,没有被读取过那么访问时间就等于创建时间,这个基本不太可能。
与文件相关的几个时间:
1、访问时间,读一次这个文件的内容,这个时间就会更新。比如:对这个文件使用more命令,ls、stat命令都不会修改文件的访问时间。
2、修改时间,对文件内容修改一次,这个时间就会更新。比如:vi后保存文件,ls -l列出的时间就是这个时间。
3、状态改变时间,通过chmod命令更改一次文件属性,这个时间就会更新,查看文件的详细的状态、准确的修改时间等,可以通过stat命令文件名。
[root@mail dd]# stat full.xb
File: `full.xb'
Size: 1368123 Blocks: 2680 IO Block: 4096 regular file
Device: fc01h/64513d Inode: 266047 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-07-16 11:44:18.812515948 +0800
Modify: 2019-07-16 11:42:23.188515952 +0800
Change: 2019-07-16 11:42:23.188515952 +0800
Access访问时间,Modify修改时间,Change状态改变时间,可以stat *查看这个目录所有文件的状态。
简单说了下文件时间,下面我们来说下find命令。
[root@mail dd]# find /var/log -mtime -1 # 查找 /var/log 下修改时间在1天之内的文件
[root@mail dd]# find /var/log -name *.log -mtime -1 # 查找 /var/log 下修改时间在1天之内以log结尾的文件
1、根据时间查找
-ctime -n 查找距现在 n*24H 内修改过的文件
-ctime n 查找距现在 n*24H 前,(n+1)*24H 内修改过的文件
-ctime +n 查找距现在 (n+1)*24H 前修改过的文件
[a|c|m]min [最后访问|最后状态修改|最后内容修改]min
[a|c|m]time [最后访问|最后状态修改|最后内容修改]time
atime 最后一次访问时间,如ls, more等,但chmod, chown, ls, stat等不会修改些时间,使用 ls -utl 可以按此时间顺序查看
ctime 最后一次状态修改时间, 如 chmod, chown 等状态时间改变但修改时间不会改变,使用 stat file 可以查看
mtime 最后一次内容修改时间, 如 vi 保存后等,修改时间发生改变的话,atime 和 ctime 也相应跟着发生改变
[root@mail dd]# ls -lt /var/log # 按修改时间顺序查看
[root@mail dd]# ls -lut /var/log # 按访问时间顺序查看,反序查看加 -r 选项
例1:删除一天之前改变的文件
[root@mail dd]# find . -name "*.bak" -mtime 1 -print0 |xargs -0 rm -v
例2:删除30天前的备份文件
[root@mail dd]# find /data/backup -type f -mtime +30 -exec rm -f {} \;
2、根据文件名查找
-name pattern : 以文件名查找
-iname pattern: 不区分文件名的大小写,只支持glob风格的查找方式:*,?,[],[^]
-regex pattern: 基于正则表达式查找文件,精确匹配文件名
例1: 查看目录下所有以.log结尾的文件
[root@mail dd]# find /var/log/ -name '*.log'
3、根据文件从属关系查找
-user USERNAME : 以用户名查找
-group GROUPNAME : 以组名查找
-uid UID :以UID号查找
-gid GID :以GID查找
-nouser : 查找没有属主的文件
-nogroup : 查找没有属组的文件
例1:查看目录下用户是mysql的日志
[root@mail dd]# find /var/log/ -user mysql
4、根据文件类型查找
-type TYPE : 以文件类型查找
f : 普通文件
d : 目录文件
b : 块设备文件
c : 字符设备文件
l : 连接文件
s : 套接字文件
p : 管道文件
例1:查看目下所有文件夹
find /var/log/ -type d
5、根据文件大小查找
-size [+|-]SIZE : 以文件大小查询,大小包含K,M,G的单位
-size 1M : 精确查找大小为1M的文件,大小上面浮动稍微有偏差
-size -1M : 查询大小小于1M的文件
-size +1M : 查询大小大于1M的文件
例1:查找目录下大于10M的文件
[root@mail dd]# find /var/log/ -size +10M
6、组合条件测试
与 : -a
默认组合逻辑,可以加-a也可以不加
[root@mail dd]# find /var/log/ -type f -a -user mysql # 两个条件同时满足
或 : -o
[root@mail dd]# find /var/log/ -type f -o -nouser # 两个条件只满足一个即可
非 : -not 或者 !表示
[root@mail dd]# find /var/log/ -not -type f # 不是普通文件
[root@mail dd]# find /var/log/ ! -type f # 同上
7、处理动作
-print : 默认为打印,不需要添加,输出入屏幕
-ls : 以ls长文件的格式形式输出
-delete : 删除查找到的文件
-fls /PATH/TO/SOMEFILE :把查询到的文件以ls详细信息格式保存到SOMEFILE文件中
-ok COMMAND {} \; : 查找到的文件传递给COMMAND命令,提每步都给用户提示确认操作
-exec COMMAND {} \; : 查找到的文件传递给COMMAND命令,直接修改完成,不给用户确认
注意:find将查找到的文件路径一次性传递给后面的命令,但有很多的命令不能接受过长的参数,导致命令的执行失败,使用如下方式可避免此错误的发生:
[root@mail dd]# find /var -type f | xargs -i COMMAND # -i参数是由find的结果传给xargs命令后,由-i指定结果代替符
例1: 查找至少1周没有访问的文件
[root@mail dd]# find /var -atime +7 -ls
8、指定查找目录范围
-maxdepth NUM : 指定最多搜索目录层级到NUM层
-mindepth NUM : 指定最少搜索目录NUM层级
9、查找空文件
-empty : 查询内容为空的文件
[root@mail dd]# find /var/log -empty # 查找当前目录下的所有空文件
10、排除符号连接
-follow : 排除符号连接