一、非实时搜索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、范围图解
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、范围图解
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 “的集合。