Linux中的文件查找命令——locate&find

目录

locate

locate的工作特性:

常用的选项:

find

查找条件

指定搜索层级

根据文件名和inode号搜索

根据属主、属组查找

根据文件类型查找

根据时间戳:

根据权限查找:

组合条件:

德·摩根定律:

处理动作

参数替换xargs

find示例


在Linux中,常用的文件查找工具有两个:locate和find。

两者的区别:locate是非实时查找,它是在数据库中查找;find是实时查找。

locate

locate查找过程是查询系统上预建的文件索引数据库:/var/lib/mlocate/mlocate.db。

索引的构建是在系统较为空闲时自动进行的(周期性任务),同时管理员也可以手动更新数据库(执行updatedb命令)。

由于索引的构建过程需要遍历整个根文件系统,所以构建过程极其消耗资源。

locate的工作特性:

  • 查找速度快
  • 可以进行模糊查找
  • 它是非实时查找
  • 搜索的是文件的全路径,而不仅仅只是文件名
  • 可能只执行用户具有读、写和执行权限的目录

locate命令语法格式:locate [OPTION]... [PATTERN]...

常用的选项:

  • -i  搜索过程中不区分大小写
  • -n  只显示前n条符合要求的项目
  • -r  可以使用正则表达式

示例:

搜索名称或者路径中包含“conf”的文件:  locate   conf

使用正则表达式来搜索以“.conf”结尾的文件: locate -r  '.conf'

 

 

find

find命令的搜索方式与locate命令的搜索方式不同,find命令搜索采用的是通过遍历指定路径完成文件查找,并且是实时查找的。

find的工作特性:

  • 由于是通过遍历方式查找,所以查找速度略慢
  • 实时查找
  • 可以精确查找
  • 可能只搜索用户具有读取和执行权限的目录

find命令语法:find [OPTION]... [查找路径] [查找条件] [处理动作]

查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕

查找条件

指定搜索层级

  • -maxdepth level 最大搜索目录深度,指定目录为第1级
  • -mindepth level 最小搜索目录深度

根据文件名和inode号搜索

  • -name "文件名称":支持使用glob
  • -iname "文件名称":不区分字母大小写
  • -inum n 按inode号查找
  • -samefile name 相同inode号的文件
  • -links n 链接数为n的文件
  • -regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
     

根据属主、属组查找

  • -user USERNAME:查找属主为指定用户(UID)的文件
  • -group GRPNAME: 查找属组为指定组(GID)的文件
  • -uid UserID:查找属主为指定的UID号的文件
  • -gid GroupID:查找属组为指定的GID号的文件
  • -nouser:查找没有属主的文件
  • -nogroup:查找没有属组的文件

根据文件类型查找

-type TYPE:

  •  f: 普通文件
  •  d: 目录文件
  •  l: 符号链接文件
  •  s:套接字文件
  •  b: 块设备文件
  •  c: 字符设备文件
  •  p: 管道文件

根据时间戳:

以“天”为单位;

  • -atime [+|-]#,
  • #: [#,#+1)
  • +#: [#+1,∞]
  • -#: [0,#)
  • -mtime
  • -ctime

以“分钟”为单位:

  • -amin
  • -mmin
  • -cmin

根据权限查找:

-perm [/|-]MODE

  • MODE: 精确权限匹配
  • /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系, +从centos7开始淘汰
  • -MODE:每一类对象都必须同时拥有指定权限,与关系0 表示不关注
  •  find -perm 755 会匹配权限模式恰好是755的文件
  • 只要当任意人有写权限时, find -perm +222就会匹配
  • 只有当每个人都有写权限时, find -perm -222才会匹配
  • 只有当其它人( other)有写权限时, find -perm -002才会匹配
     

组合条件:

  • 与: -a
  • 或: -o
  • 非: -not, !

德·摩根定律:

  • (非 A) 或 (非 B) = 非(A 且 B)
  • (非 A) 且 (非 B) = 非(A 或 B)

示例:!A -a !B = !(A -o B)           !A -o !B = !(A -a B)

处理动作

  • -print:默认的处理动作,显示至屏幕
  • -ls:类似于对查找到的文件执行“ls -l” 命令
  • -delete:删除查找到的文件
  • -fls file:查找到的所有文件的长格式信息保存至指定文件中
  • -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
  • -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
  • {}: 用于引用查找到的文件名称自身
  • find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性
  • 传递给后面的命令

参数替换xargs

由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令
xargs用于产生某个命令的参数, xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为arguments
注意:文件名或者是其他意义的名词内含有空格符的情况
有些命令不能接受过多参数,命令执行可能会失败, xargs可以解决
 

 

find示例

find -name snow.png    查找文件名为snow.png的文件
find -iname snow.png     查找文件名为snow.png的文件,且不区分大小写
find / -name “*.txt”          查找根目录下,文件名以.txt结尾的文件
find  /var -name “*log*”         查找/var目录下,文件名中包含“log”的文件
find -user joe -group joe  查找属于joe用户,joe组的文件
find -user joe -not -group joe  查找属于joe用户,但是不属于joe组的文件
find -user joe -o -user jane     查找属于joe用户或者jane用户的文件
find -not \( -user joe -o -user jane \)   查找不属于joe用户,并且也不属于jane用户的文件
find  /  -user joe -o -uid 500    查找根目录下属于joe用户或者inode号为500的文件
 

找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp \( -not -user root -a -not -name 'f*' \) -ls
find /tmp -not \( -user root -o -name 'f*' \) –ls

排除目录
示例:
查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
find /etc -path ‘/etc/sane.d’ -a –prune -o -name “*.conf”
查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件
find /etc \(–path ‘/etc/sane.d’ –o –path ’/etc/fonts’ \) -a -prune –o -name “*.conf


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值