文件查找命令 locate 和 find

本文详细介绍了Linux系统中查找文件的两个命令——locate和find。locate基于预构建的索引快速查找文件,适用于非实时搜索,而find通过实时搜索路径,适合查找系统文件。文章分别讲解了两者的特性、用法、选项以及各种查找条件,如文件名、属主、大小、时间戳等。此外,还提供了多个练习题以加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、非实时搜索locate

(一)locate特性

  • 1、依赖于事先构建的索引,在文件系统上查找符合条件的文件;
  • 2、索引数据库位置 /var/lib/mlocate/mlocate.db ;
  • 3、默认是系统每次开机后自动开始执行更新索引数据库任务;
  • 4、手动更新索引数据库:
    • updatedb
  • 5、搜索速度超快,但不适合搜索那些经常变化的文件,即非实时搜索;
  • 6、搜索的是文件的绝对路径;
  • 7、默认是模糊搜索。

(二)用法格式

locate   [OPTION]   KEYWORD

(三)有用的OPTION选项

  • -i :不区分大小写
  • -r :使用正则表达式
  • -n N :只列举前N个匹配的项目

(四)⚠️注意事项⚠️

  • 1、默认是模糊搜索:搜索文件名称或者绝对路径中包含KEYWORD的文件;
  • 2、加 -r 选项:精确匹配正则表达式PATTERN的搜索条件。

二、实时搜索find

(一)find特性

  • 1、通过指定路径完成文件查找;
  • 2、搜索速度很慢,适合查找非系统文件,即实时查找;
  • 3、可能只搜索用户具备读取和执行权限的目录;
  • 4、默认是精确匹配。

(二)用法格式

find   [PATH]   [OPTION]   [EXPRESSION]
  • PATH:指定具体的目标路径,(省略不写)默认是当前目录;
  • EXPRESSION:指定查找条件,支持通过精确匹配文件名、大小、类型、权限的条件,也支持模糊匹配,(省略不写)默认是找出指定路径下的所有文件。

⚠️通过find查找的”所有文件”包括隐藏文件!⚠️

三、简单查找条件

(一)搜索层级

(1)指定最大搜索深度为第LEVEL层,搜索范围是第1层到第LEVEL层

find   PATH   -maxdepth   LEVEL

(2)指定最小搜索深度为第LEVEL层,搜索范围是第LEVEL层到更深层次

find   PATH   -mindepth   LEVEL

(3)只在第LEVEL层进行搜索

find   PATH   -maxdepth   LEVEL   -mindepth   LEVEL

(二)文件名

(1)通过通配符GLOB模糊匹配文件名,区分大小写

find   PATH   -name   "GLOB"

(2)通过通配符GLOB模糊匹配文件名,不区分大小写

find   PATH   -iname   "GLOB"

(3)通过正则表达式PATTERN精确匹配文件名,区分大小写

find   PATH   -regex   "PATTERN"

(三)节点号inode

(1)查找节点号为INODE的所有文件

find   PATH   -inum   INODE

(2)查找与FILENAME的节点号inode一样的所有文件

find   PATH   -samefile   FILENAME

(3)查找链接数为N的所有文件

find   PATH   -links   N

(四)属主

(1)查找属主为USERNAME的所有文件

find   PATH   -user   USERNAME

(2)查找属主为指定UID的所有文件

find   PATH   -uid   UID

(3)查找没有属主的所有文件

find   PATH   -nouser

(五)属组

(1)查找属组为GROUPNAME的文件

find   PATH   -group   GROUPNAME

(2)查找属组为指定GID的所有文件

find   PATH   -gid   GID

(3)查找没有属组的所有文件

find   PATH   -nogroup

(六)文件类型

(1)查找普通文件

find   PATH   -type   f

(2)查找目录文件

find   PATH   -type   d

(3)查找链接文件

find   PATH   -type   l

(4)查找套接字文件

find   PATH   -type   s

(5)查找块设备文件

find   PATH   -type   b

(6)查找字符设备文件

find   PATH   -type   c

(7)查找管道文件

find   PATH   -type   p

(七)空文件

搜索大小为空的所有文件,包括所有类型的文件

find   PATH   -empty

(八)空目录

只搜索大小为空的所有目录

find   PATH   -type d -empty

(九)非空普通文件

只搜索大小为空的所有普通文件

find   PATH   !   -empty   -type   f

四、复杂查找条件

(一)组合条件

1、条件符号

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

2、徳·摩根定律

徳·摩根定律

3、用法格式

  • 用法一:
    • 要么不匹配EXPRESSION1,要么不匹配EXPRESSION2;
    • 即匹配”EXPRESSION1和EXPRESSION2的交集”的补集
find   PATH   !   \(   EXPRESSION1   -a   EXPRESSION2   \)
  • 用法二:
    • 不匹配EXPRESSION1,同时也不匹配EXPRESSION2;
    • 即匹配”EXPRESSION1和EXPRESSION2的并集”的补集
find   PATH   !   \(   EXPRESSION1   -o   EXPRESSION2   \)

(二)排除目录

在查找结果中排除目录DIR1和目录DIR2

find   PATH   \(   -path   DIR1   -o   -path   DIR2   \)   -a   -prune 

(三)文件大小

1、常见单位

  • c :字节,Byte
  • k :千字节,KiByte
  • M :兆字节,MiByte
  • G :吉字节,GiByte

2、范围图解

范围图解1

3、用法示例

(1)大小范围是 ( 1k , 2k ] 相当于 ( 1024c , 2048c ]

find   PATH   -size   2k

(2)大小范围是 [ 0 , 1k ] 相当于 [ 0 , 1024c ]

find   PATH   -size   -2k

(3)大小范围是 ( 2k , ∞ ) 相当于 ( 2048c , ∞ )

find   PATH   -size   +2k

(四)时间戳

1、查看文件的三个时间戳

stat   FILENAME

2、范围图解

范围图解2

3、以”天”为单位,用法示例

(1)文件访问时间;最近一天内被访问查看过的文件

find   PATH   -atime   -1

(2)文件内容修改时间;最近一天内文件内容被修改的文件

find   PATH   -mtime   -1

(3)文件元数据改变时间;最近一天内文件元数据被改变的文件

find   PATH   -ctime   -1

4、以”分钟”为单位,用法示例

(1)文件访问时间;最近一分钟内被访问查看过的文件

find   PATH   -amin   -1

(2)文件内容修改时间;最近一分钟内文件内容被修改的文件

find   PATH   -mmin   -1

(3)文件元数据改变时间;最近一分钟内文件元数据被改变的文件

find   PATH   -cmin   -1

(五)权限

1、精确匹配

会匹配权限模式恰好是666的文件,即”属主有rw权限,属组有rw权限,其他人有rw权限”

find   PATH   -perm   666

2、模糊匹配:或关系

find   PATH   -perm   /666

➡️分析:

  • (1)/666 相当于” u=110 或 g=110 或 o=110 “;
  • (2)”1”表示要检查是否匹配,”0”表示不关注;
  • (3)匹配列表有:
    • u=110或111,g为任意值,o为任意值;
    • u为任意值,g=110或111,o为任意值;
    • u为任意值,g为任意值,o=110或111。

3、模糊匹配:与关系

find   PATH   -perm   -666

➡️分析:

  • (1)-666相当于”u=110 且 g=110 且 o=110”;
  • (2)”1”表示要检查是否匹配,”0”表示不关注;
  • (3)匹配列表有:
    • u=110或111,g=110或111,o=110或111。

五、处理动作

(一)长列表格式

以长列表格式显示查找结果,类似于对查找到的文件执行”ls -l”命令

find   PATH   EXPRESSION   -ls 

(二)重定向到文件

以长列表格式处理查找结果,并且直接重定向到文件FILE中

find   PATH   EXPRESSION   -fls   FILE 

(三)查找结果引用

{} :用于引用查找到的文件名本身,可能是绝对路径、也可能是相对路径

find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令

(四)交互式执行Linux命令

对查找结果交互式执行COMMAND操作,每执行一次,均会询问用户操作

find   PATH   EXPRESSION   -ok   COMMAND   {}   \;   

⚠️警告: -ok 需要 \; 来标记COMMAND命令的结束位置

(五)批量静默之行Linux命令

对查找结果批量静默执行COMMAND命令,中间不询问用户任何操作

find   PATH   EXPRESSION   -exec   COMMAND   {}   \;  

⚠️警告: -exec 需要 \; 来标记COMMAND命令的结束位置

六、练习题

(一)查找/var目录下属主为root,且属组为mail的所有文件

参考方法:

find /var -user root -group mail -ls

实现思路:

  • (1)-user root :属主为root
  • (2)-group mail :属组为mail
  • (3)-ls :长列表格式

(二)查找/var目录下不属于root、lp、gdm的所有文件

参考方法:

find /var ! \( -user root -o -user lp -o -user gdm \) -ls

实现思路:

  • (1)-user root -o -user lp -o -user gdm :属组为root或lp或gdm的集合的并集
  • (2) ! ( ) :取上面集合的补集
  • (3)-ls :长列表格式

(三)查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是 postfix的文件

参考方法:

$ find /var -mtime -7 -a -not \( -user root -o -user postfix \) -ls

实现思路:

  • (1)-mtime -7 :最近七天内文件内容被修改的文件
  • (2)-a :且关系
  • (3)-user root -o -user postfix :属主为root或postfix的集合的并集
  • (4)-not ( ) :取上面集合的补集
  • (5)-ls :长列表格式

(四)查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件

参考方法:

$ find / -nouser -o -nogroup -a -atime -7

实现思路:

(1)-nouser -o -nogroup :没有属主或没有属组的集合
(2)-a :且关系
(3)-atime -7 :最近七天内被访问查看过的文件

(五)查找/etc目录下大于1M且类型为普通文件的所有文件

参考方法:

$ find /etc -size +1M -a -type f -ls

实现思路:

  • (1) -size +1M :大小范围是 ( 1M , ∞ )
  • (2)-a :且关系
  • (3)-type f :普通文件

(六)查找/etc目录下所有用户都没有写权限的文件

参考方法:

$ find /etc ! -perm /222 -ls

实现思路:

  • (1)”所有用户都没有写权限”的补集:至少有一类用户有写权限;
  • (2)-perm /222 :相当于” u=010 或 g=010 或 o=010 “,表示至少有一类用户有写权限的集合;
  • (3) ! :取上面集合的补集。

(七)查找/etc目录下至少有一类用户没有执行权限的文件

参考方法:

$ find /etc ! -perm -222 -ls

实现思路:

  • (1)”至少有一类用户没有执行权限”的补集:所有用户都有写权限;
  • (2)-perm -222 :相当于” u=010 且 g=010 且 o=010 “,表示所有用户都有写权限;
  • (3) ! :取上面集合的补集。

(八)查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件

参考方法:

$ find /etc/init.d -perm -113 -ls

实现思路:

  • (1)”所有用户都有执行权限,且其它用户有写权限”用模式法表示为:” u=001 且 g=001 且 o=011 “
  • (2)-perm -113 :相当于” u=001 且 g=001 且 o=011 “的集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值