前言
我们的系统中有很多文件,在我们日常使用过程中,经常需要查找一些符合某条件的文件,如果一个一个文件夹翻下来的话,无疑效率是很慢的,接下来,就给大家介绍两个命令,能让我们在系统中快速的查找到我们所需要的文件。
两个命令分别为locate和find,locate很简单,我们就简单介绍一下,本文主要还是介绍find的具体用法。
一、locate命令
locate命令实际上是查询数据库中的内容,所以搜索的速度很快,但是想要使用locate命令查询,我们就要事先构建好索引,索引的构建过程需要遍历整个根文件系统,极消耗资源。下面我们来说一下locate的具体用法和特点
1.1 locate用法
命令:locate
格式:locate KEYWORD
选项: -i 不区分大小写的搜索
-n N 只列举前N个匹配项目
-r 支持正则表达式
1.2 locate特点
查找速度快
模糊查找
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录
1.3 locate查询补充
使用locate查询,实际是对数据库储存内容的列出,在查找前会判定目录有没rx权限,如果没有权限,依然不列出。此操作在数据库中进行,而非实时查询。如果我们想在不退出登录的情况下更新数据库,则要用到updatedb命令,该命令更新很慢,具体时间视你的系统中有多少文件而定。
二、find命令
由于locate的非精确查找和非实时查找的特性,导致locate用的不多。而find命令支持实时查找,拥有众多查找选项,是linux上查找最常用的,但是缺点也是比较明显: 如果文件数量很多的话,查找起来很慢。但那又如何,find依然是最有用且最常用的Linux查找命令。
2.1 find命令特点
查找速度略慢
精确查找
实时查找
可能只搜索用户具备读取和执行权限的目录
2.2 find用法
命令:find
格式:find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
2.3 find选项
2.3.1指搜索层级查找
-maxdepth level最大搜索深度
-mindepth level最小搜索深度
Example:
1 [root@ keer app]#find -maxdepth 7
2
3 .
4
5 ./dev1
6
7 ./dev1/dev2
8
9 ./dev1/dev2/dev3
10
11 ./dev1/dev2/dev3/dev4
12
13 ./dev1/dev2/dev3/dev4/dev5
14
15 ./dev1/dev2/dev3/dev4/dev5/dev6
16
17 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
18
19 [root@ keer app]#find -mindepth 7
20
21 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
2.3.2 按文件名和inode号查找
-name “文件名称” 基于名称的精确查找
-iname 基于名称忽略大小写的精确查找
-inum n 基于inode号查找(只显示名称,长列出则加-ls)
-samefile 基于相同inode号的查找(查找硬链接)
-links n 硬链接为n的文件
-regex “PATTERN” 支持正则(默认只支持范围,不支持通配符)
-regextype egrep -regex 支持egrep同标准的正则
Example:
1 [root@ keer app]#find -name hello
2
3 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
4
5 [root@ keer app]#find -iname HELLO
6
7 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
8
9 [root@ keer app]#find -inum 1310721
10
11 ./dev1
12
13 [root@ keer app]#find -inum 1310721 -ls
14
15 1310721 4 drwxr-xr-x 3 root root 4096 Aug 8 16:47 ./dev1
16
17 #因为find -regex匹配的是整个路径,所以前面必须加.*才可以
18
19 [root@ keer app]#find . -regex ".*[a-z].*"
20
21 ./dev1
22
23 ./dev1/dev2
24
25 ./dev1/dev2/dev3
26
27 ./dev1/dev2/dev3/dev4
28
29 ./dev1/dev2/dev3/dev4/dev5
30
31 ./dev1/dev2/dev3/dev4/dev5/dev6
32
33 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
34
35 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
2.3.3 根据属主查找
-user 用户名 基于文件owner的查找
-uid userid 基于文件uid的查找
-nouser 查找没有owner的文件
Example:
1 [root@ keer app]#find -user root
2
3 .
4
5 ./dev1
6
7 ./dev1/dev2
8
9 ./dev1/dev2/dev3
10
11 ./dev1/dev2/dev3/dev4
12
13 ./dev1/dev2/dev3/dev4/dev5
14
15 ./dev1/dev2/dev3/dev4/dev5/dev6
16
17 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
18
19 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
20
21 [root@ keer app]#find -uid 0
22
23 .
24
25 ./dev1
26
27 ./dev1/dev2
28
29 ./dev1/dev2/dev3
30
31 ./dev1/dev2/dev3/dev4
32
33 ./dev1/dev2/dev3/dev4/dev5
34
35 ./dev1/dev2/dev3/dev4/dev5/dev6
36
37 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
38
39 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
40
41 [root@ keer app]#find -nouser
42
43 ./aaa
2.3.4 根据属组查找
-group 组名 基于文件group的查找
-gid groupid 基于文件gid的查找
-nogroup 查找没有group的文件
Example:
1 [root@ keer app]#find -group root
2
3 .
4
5 ./dev1
6
7 ./dev1/dev2
8
9 ./dev1/dev2/dev3
10
11 ./dev1/dev2/dev3/dev4
12
13 ./dev1/dev2/dev3/dev4/dev5
14
15 ./dev1/dev2/dev3/dev4/dev5/dev6
16
17 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
18
19 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
20
21 [root@ keer app]#find -gid 0
22
23 .
24
25 ./dev1
26
27 ./dev1/dev2
28
29 ./dev1/dev2/dev3
30
31 ./dev1/dev2/dev3/dev4
32
33 ./dev1/dev2/dev3/dev4/dev5
34
35 ./dev1/dev2/dev3/dev4/dev5/dev6
36
37 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
38
39 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
40
41 [root@ keer app]#find -nogroup
42
43 ./aaa
2.3.5根据文件类型查找
-type TYPE:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
Example:
1 [root@ keer app]#find -type f
2
3 ./aaa
4
5 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
6
7 [root@ keer app]#find -type d
8
9 .
10
11 ./dev1
12
13 ./dev1/dev2
14
15 ./dev1/dev2/dev3
16
17 ./dev1/dev2/dev3/dev4
18
19 ./dev1/dev2/dev3/dev4/dev5
20
21 ./dev1/dev2/dev3/dev4/dev5/dev6
22
23 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
2.3.6组合查找
查找条件:
与:-a(可省略)
或:-o 非:-not, !
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
Example:
1 !A -a !B = !(A -o B)
2
3 !A -o !B = !(A -a B)
2.3.7 按文件大小查找
-size [+|-]#UNIT 根据文件大小来查找
常用单位:k, M, G,c(byte)
#UNIT: (#-1, #]如:6k 表示(5k,6k]
-#UNIT:[0,#-1]如:-6k 表示[0,5k]
+#UNIT:(#,∞)如:+6k 表示(6k,∞)
更直观的可以从下图中看出:

2.3.8 按时间戳查找
以“天”为单位
-atime [+|-]#
#UNIT: [#,#+1) 例:3 表示前3天到4天
-#UNIT:[#+1,∞] 例:-3 表示4天以前
+#UNIT:[0,#) 例:+3 表示三天之内
-mtime
-ctime
以“分钟”为单位
-amin
-mmin
-cmin
更直观的可以从下图中看出:

2.3.9 按权限查找
-perm
mode:精确权限匹配
+mode[/mode] 任何一类(u,g,o)对象的权限中只要能一位匹配即可(或关系)。(“+”从CentOS7开始淘汰)
-mode 每一类对象都必须同时拥有指定权限(与关系)。
注:0 表示不关注。
Example:
• find -perm 755会匹配权限模式恰好是755的文件
• 只要当任意人有写权限时,find -perm /222就会匹配
• 只有当每个人都有写权限时,find -perm -222才会匹配
• 只有当其它人(other)有写权限时,find -perm -002才会匹配(/002也可)
2.4 find补充
2.4.1 处理动作
-print 默认
-delete 直接删除所查找到的文件,不询问。
-ls 长列出所查找到的文件
-fls file 将查找到的文件长列出导入到指定文件。
配合重定向使用(> file)
-ok command \; 对查找到的文件当做下一命令的参数去执行(交互式确认)
-exec command \; 对查找到的文件当做下一命令的参数去执行(非交互式)
注:使用-ok和-exec时,必须以“ \;”结尾
Example:
1、备份以“.conf”结尾的文件,并添加.orig扩展名
find-name “*.conf” -exec cp {} {}.orig \;
2、在你的主目录中寻找可被其它用户写入的文件,并取消这些文件其他用户的写权限
find ~ -perm -002 -exec chmodo-w {} \;
2.4.2参数替换xargs
在我们使用的过程中,由于很多命令不支持管道符“|”来传递参数,但是在我们的日常工作中有这个必要,于是,就出现了xargs命令。xargs用于产生某个命令的参数,可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分割成为 arguments。在这里我们需要注意的是,文件名或者其他意义的名词内含有空格符的情况。
当然,有些命里不能接受过多参数,这样命令可能会执行失败,这种情况也可以用xargs来解决。
Example:
1、寻找以f开头的文件,并删除。
ls f* |xargs rm
2、寻找/sbin下所属者权限位为满的文件,并长列出。
find /sbin -perm +700 | xargs ls –l
三、小练习
说了这么多,我们来做一些练习练练手吧~活学活用才能更好的掌握喏٩(๑❛ᴗ❛๑)۶
1、查找/var目录下属主为root,且属组为mail的所有文件
find /var -user root -group mail -ls
2、查找/var目录下不属于root、lp、gdm的所有文件
find /var ! \( -user root -o -user lp -o -user gdm \) -ls
3、查找/var目录下最近一周内其内容修改过,同时属主不为root、也不是postfix的文件
find /var -mtime +7 ! \( -user root -user postfix \) -ls
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
find / -nouser -o -nogroup -atime +7 -ls
5、查找/etc目录下大于1M且类型为普通文件的所有文件
find /etc/ -size +1M -type f -ls
6、查找/etc目录下所有用户都没有写权限的文件
find /etc/ ! -perm /222 -ls
7、查找/etc目录下至少有一类用户没有执行权限的文件
find /etc/ ! -perm -111 -ls
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
find /etc/init.d/ -perm -113 -ls
以上。如有不足之处还请大家多多指教喏٩(๑>◡

本文详细介绍Linux系统中的locate和find命令的使用方法,包括命令格式、选项及实例演示,帮助读者高效定位所需文件。
426

被折叠的 条评论
为什么被折叠?



