Linux 系统中find查找

Admin 2019-07-16 14:58:33 Linux命令

在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 : 排除符号连接

相关文章
最新推荐