目录

7.2 文件查找工具

文件查找工具

/images/linux_mt/linux_mt.jpg

本节我们学习文件查找工具,主要是两个命令的使用 locatefind

1. locate

locate [OPTION]... PATTERN...

  • 作用: 依赖于事先构建好的索引库;查找指定模式匹配的文件
  • 规则: 默认使用 pattern 进行全路径模糊匹配
  • 参数:
    • PATTERN: 匹配规则,可多个
  • 选项:
    • -a:所有 pattern 的匹配规则必须同时满足
    • -b:只匹配路径中的基名,默认匹配整个路径;
    • -c:统计出共有多少个符合条件的文件
    • -r:使用基本正则表达式进行匹配
  • 特性:
    • 查找速度快;
    • 模糊查找;
    • 非实时查找;

updatedb:

  • 作用: 构建 locate 所需的数据库(耗费资源)
  • 附注: 索引构建过程需要遍历整个根文件系统,极消耗资源;

2. find

find [OPTION]... [查找起始路径] [查找条件] [处理动作]

  • 查找起始路径:指定具体搜索目标起始路径;默认为当前目录;
  • 查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;默认为找出指定路径下的所有文件;
  • 处理动作:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出;

查找条件

find 的查找条件可以通过选型或测试进行指定,较为常用的是测试,有如下几种测试条件

  • 文件名:
    • -name "pattern": 支持使用通配符,仅仅匹配文件名称,必须是完全匹配文件名而不是部分匹配
    • -iname "pattern": 忽略名称大小,必须是完整匹配文件名
    • -regex pattern: 使用正则表达式,必须完整匹配整个文件路径,不仅仅是文件名称
  • 根据属主,属组
    • -user username: 查找属主为指定用户的文件
    • -group groupname: 查找属组为指定组的文件
    • -uid userid: 查找属主为指定 uid 的文件
    • -gid groupid: 查找属组为指定 gid 的文件
    • -nouser: 查找没有属主的文件
    • -nogroup: 查找没有属组的文件
    • eg: find /tmp -user root -ls
  • 根据文件类型查找
    • -type TYPE: 查找指定类型的文件
      • f: 普通文件
      • d: 目录文件
      • l:符号链接文件
      • b:块设备 文件
      • c:字符设备文件
      • p:管道文件
      • s:套接字文件
  • 组合条件
    • -a : and
    • -o : or
    • -not|! : not
    • eg:
      • find /tmp \( -nouser -o -nogroup \) -ls
      • find /tmp -nouser -ls -o -nogoroup -ls
      • find /tmp \( -not -user root -a -not -name "fstab" \) -ls
      • 附注: 处理动作仅限于位置相关的查找
  • 文件大小
    • -size [+|-]#UNIT:
      • UNIT: 查找单位,k,M,G
    • eg: find /var -size +3k -exec ls -h {} \
      • 3k: 表示范围为 (2k, 3k]
      • -3k: 表示范围为 [0, 2k]
      • +3k: 表示范围为 (3k, ∞)
  • 根据时间戳
    • 以天为单位
      • -atime [+|-]#
      • -mtime [+|-]#
      • -ctime [+|-]#
      • eg: find /var -atime 3 -ls
        • 3: 表示[3, 4)
        • +3 表示[4, ∞)
        • -3 表示[0, 3)
    • 以分钟为单位
      • -amin [+|-]#
      • -mmin [+|-]#
      • -cmin [+|-]#
  • 根据权限查找
    • -perm [/|-]MODE
    • eg: find /var -perm 640 -ls
      • 640: 精确查找,0表示不考虑
      • /640: 任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足,9位权限之间存在“或”关系;
      • -640: 每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足,9位权限之间存在“与”关系;

处理动作

  • -print: 默认动作,显示至屏幕
  • -ls: 类似对查找的文件执行 ls -l 命令
  • -delete: 删除查到到的文件
  • -fls /path: 查找到的所有文件的长格式信息保存至指定文件中
  • -ok COMMAND {} \;
    • 对查找到的每个文件执行由 COMMAND指定的命令
    • 对每个文件执行命令之前,都会交互式确认
    • {}:表示find 传递的文件名本身
    • ;:固定格式符
  • exec COMMAND {} \;:作用同 ok,但不会交互式确认
  • eg:
    • find /tmp -nouser -exec chown root {} ;
    • find /tmp -cmin -5 -exec mv {} {}.new ;
      • {}:表示find 传递的文件名本身

需要注意的是 find 传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;但是有些命令不能接受过长的参数,此时命令执行会失败;使用 find | xargs COMMAND 可规避此问题。xargs 命令可将参数一次一个传递给 COMMAND。

3. 练习

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查找/var/目录属主为root且属组为mail的所有文件;
> find /var -user root -a -group mail

# 查找/usr目录下不属于root、bin或hadoop的所用文件;
> find /usr -not -user root -a -not -user bin -a -not -user hadoop
> find /usr -not \(-user root -o -user bin -o -user hadoop\)

# 查找/etc/目录下最近一周内其内容修改过的,且不属于root且不属于hadoop的文件;
> find /etc -mtime -7 -a -not \(-user root -o -user hadoop\)

# 查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件;
> find / \(-nouser -o -nogroup\) -a -atime -30

# 查找/etc/目录下大于1M且类型为普通文件的所有文件;
> find /etc -size +1M -type f

# 查找/etc/目录所有用户都没有写权限的文件;
> find /etc/ -not -perm /222

# 查找/etc/目录下至少有一类用户没有写权限;
> find /etc/ -not -perm -222

# 查找/etc/init.d/目录下,所有用户都有执行权限且其它用户有写权限的文件;
> find /etc/init.d/ -perm -113