Linux下的枯燥命令-find

327 阅读5分钟

引言: 想查哪就查哪,蒙多

1. 作用

根据条件查找某个路径下符合规则的文件、文件夹信息

2. 基础格式

基础语法格式:

find [路径] [选项] [操作]

3. 常用选项

选项 含义
-name 根据文件名查找
-perm 根据文件权限查找
-prune 该选项可以排除某些查找目录
-user 根据文件属主查找
-group 根据文件属组查找
-mtime -n | +n 根据文件更改时间查找
-nogroup 查找无有效属组的文件
-nouser 查找无有效属主的文件
-newer file1 !file2 查找更改时间比file1新但是比file2旧的文件
-type 按照文件类型查找
-size -n | +n 按文件大小查找
-mindepth n 从n级子目录开始搜索
-maxdepth n 最多搜索到n级子目录

4. 场景实操

注:以下场景均以 /tmp 文件夹为示例,实际使用过程中,请替换成要搜索的路径

4.1 根据文件名查找文件(常用)

# 查找 /tmp 目录下以abc开头的文件
find /tmp -name 'abc*' 

# 查找 /tmp 目录下所有的json文件
find /tmp -name '*.json'

# 当不填写路径时,默认当前路径,等同于 find .
find -name 'abc*'

# 使用 -iname忽略大小写匹配
find /tmp -iname 'abc*'

4.2 根据文件归属查找文件

# 查找/tmp目录下,属主为root的文件
find /tmp -user root

# 查找/tmp目录下,属组为root的文件
find /tmp -group root

4.3 根据文件类型查找文件

-type 可用值有如下选项:

  • f 文件
  • d 目录
  • c 字符设备文件
  • b 块设备文件
  • l 链接文件
  • p 管道文件
# 查找/tmp目录下,名字中带有abc的文件
find /tmp -name '*abc*' -type f

# 查找/tmp目录下,名字中带有abc的文件夹
find /tmp -name '*abc*' -type d

4.4 根据文件大小查找文件

-size 可用值有如下选项:

  • +n 大小大于n的文件
  • -n 大小小于n的文件
  • n大小等于n的文件(部分发行版匹配不到,不推荐使用)
# 查找/tmp目录下小于200字节的文件
find /tmp -size -200c

# 查找/tmp目录下大于1M的文件
find /tmp -size +1M

可选的单位选项:

  • b 块,1b=512字节
  • c 字节 1c=1字节
  • w 2字节 1w=2字节
  • k 千字节 1k=1024字节
  • M 兆字节 1M=1024*1024字节
  • G 1G=102410241024 字节

4.5 根据修改时间查找文件

-mtime 可用值有如下选项:

  • -n n天以内修改的文件
  • +n n天以外修改的文件
  • n 正好n填修改的文件

-mmin 可用值有如下选项:

  • -n n分钟以内修改的文件
  • +n n分钟以外修改的文件
# 查找/tmp目录下30天之前修改名称包含abc的文件
find /tmp -name '*abc*' -mtime +30 -type f

# 查找/tmp目录下3分钟内修改的文件 
find /tmp -mmin -3 -type f

4.6 过滤查找目录层级

# 从/tmp的第2级子目录开始搜索,名称中包含abc的文件
find /tmp -mindepth 2 -name '*abc*'

# 搜索/tmp中名称中包含abc的文件,最多搜索到3级目录
find /tmp -maxdepth 3 -name '*abc*'

目录层级过滤条件要放到最前面,这样匹配之前就过滤掉了不需要匹配的目录,效率最高

4.7 查找无归属的文件

# 查找/tmp下无属主的文件
find /tmp -nouser

# 查找/tmp下无属组的文件
find /tmp -nogroup

4.8 根据权限查找文件

# 查找所有拥有最高权限的文件,排查风险
find /tmp -perm 777

4.9 过滤某些特定文件夹

# 查找/tmp下名称中包含abc的文件,排除掉/tmp/ddd文件夹下的文件
find /tmp -path /tmp/ddd -prune -o -name '*abc*'

4.10 根据新旧关系过滤文件

# 查找/tmp下名称中包含abc,而且修改时间大于file1的文件
find /tmp -newer file1 -name '*abc*'

# 查找/tmp下名称中包含abc,而且修改时间大于file1,小于file2的文件
find /tmp -newer file1 !file2 -name '*abc*'

4.11 查找到文件后进行操作

  • -print 默认选项,将查找到的内容打印出来,可不加
  • -exec 对查找到的文件,进行特定的操作,命令格式为 -exec 'command' {} ;
  • -ok 和exec 功能类似,但是涉及到提示的地方,会给用户相关提示

使用示例:

# 删除/tmp目录下,名称中包含abc的所有文件
find /tmp -name '*abc*' -type f -exec rm -rf {} \;

# 将/tmp目录下,名称中包含abc的所有文件复制到 /tmp1目录下
find /tmp -name '*abc*' -type f -exec cp {} /tmp1 \;

# 将/tmp目录下,以.log结尾的,更改时间在7天以上的文件,全部删除
find /tmp -name '*.log' -mtime +7 -exec rm -rf {} \;

4.12 多个条件之间的逻辑运算符

  • -a 与,添加多个条件时,默认就是与关系,可以省略不加
  • -o 或
  • -not | ! 非
# 查找/tmp目录中,所有属主不是root的文件
find /tmp -not -user root

# 查找/tmp目录中,文件名中包含abc或者大小大于1M的文件
find /tmp -type f -a \( -name '*abc*' -o -size +1M \)

5. 相似命令对比

5.1 locate

作用:文件查找

与find命令的差异:

  • find命令扫描磁盘,locate从数据库文件中进行查找
  • find默认精准匹配,locate默认模糊匹配
  • locate数据库文件,一般每天生成一次,不能实时查询到最新数据,可通过updatedb手动触发数据库文件更新

5.2 whereis

作用:查找某个可执行二进制文件、帮助文档、源代码文件等

常用参数:

  • 不加参数,返回二进制文件、帮助文档文件、源代码文件
  • -b 只返回二进制文件
  • -m 只返回帮助文档文件
  • -s 只返回源代码文件

5.3 which

作用: 查找可执行二进制文件,等同于 whereis -b

5.4 各查找命令的适用场景

命令 适用场景 优缺点
find 查找某一类文件 功能强大,需要扫描磁盘,速度慢
locate 只可以查找单个文件 功能单一,从系统数据库查询,速度快
whereis 查找程序的可执行文件、帮助文档等 查找帮助文档、源代码用
which 只可以查找程序的可执行文件 用于查找可执行命令的绝对路径