Linux下find命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。下面通过介绍一些常用的选项。
目录:
1、locate命令
2、find命令
3、xargs命令
4、示例说明
1、locate命令:
(1)使用方法及常见选项
locate - find files by name
usage:locate [OPTION]… PATTERN…
option:
-i:不区分大小写;
-n N :只列举前N个匹配结果;
-r :使用regex来搜索文件
(2)locate命令选项的优缺点
1、locate命令搜索速度快;
2、搜索的是文件的全路径,不仅仅是文件名;
3、可能只搜索用户具备读取和执行权限的目录;
4、模糊搜索非实时搜索,它是以文件索引数据库进行搜索的/var/lib/mlocate/mlocate.db。
此索引库是在系统较为空闲的情况下进行自动进行更新,管理员可以直接手动更新,使用命令updatedb;
[root@centos7 ~]#updatedb
注意:locate搜索需要遍历整个跟文件系统,极其消耗资源。
2、find命令:
(1) 实时查找工具,通过遍历整个指定路径完成文件查找;
(2)工作特点:
•查找速度略慢
•精确查找
•实时查找
•可能只搜索用户具备读取和执行权限的目录
(3)usage:
find [OPTION]… [查找路径] [查找条件] [处理动作]
[查找路径] :指定具体的路径下进行查找;默认为当前所在路径 [查找条件] ;指定查找的标准,可以是文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件; [处理动作] :对符合条件的文件做操作,默认输出至屏幕;
查找条件:
-maxdepth LEVEL:最大的搜索目录深度;
-mixdepth LEVEL:最小的搜索目录深度;示例:
find -maxdepth 2 -mindepth 3 -name “*.conf”-name “文件名称” :支持使用通配符;
-iname “文件名称”:忽略字符大小写;
-inum n:按节点数查找;
-samefile name:相同inode号的文件;
-link n 连接数为n的文件;
-regex “PATTERN”:以pattern匹配整个文件路径字符串,而不仅仅是文件名称;根据文件从属关系查找:
-user USERNAME:查找属主为指定用户的文件;
-group GROUPNAME:查找属组为指定组的文件;
-uid USERID:查找属主为指定UID的文件;
-gid GOURPID:查找属组为指定GID的文件;
-nouser:查找没有属主的文件;
-nogroup:查找没有属组的文件;
注意:查找条件默认为并且的关系;根据文件类型进行查找
-type TYPE:
-f: 普通文件
-d: 目录文件
-l: 符号链接文件
-s:套接字文件
-b: 块设备文件
-c: 字符设备文件
-p: 管道文件根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G,c(byte) #UNIT: (#-1, #]
如:6k 表示(5k,6k] -#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)组合条件测试
-a 与
-o 或
! -not 非
德· 摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)根据文件大小查找:
-size [+|-] #
-size # (#-1,#]
-size +# (#,无穷)
-size -# [0,#-1]根据时间戳查找:
-atime [+|-] #
-atime # [#+1,#)
-atime +# [#+1,无穷]
-atime -# [0,#)根据文件权限查找:
-perm [/|+] MODE
MODE 精确查找
/MODE 任何一类用户的权限属于就能匹配;
-MODE 每一类用户必须拥有指定权限就能匹配;
注意:在-或/情况下,0表示不关心有没有权限;
处理动作
-print :默认的处理动作,显示至屏幕上;
-ls:列出搜索到的详细信息;类似于“ls -l”命令的结果;
-delete:删除查找到的文件;
-fls file :查找的长格式信息输出在file文件中,相当于重定向;
-ok COMMAND {}\; :对查找到的每个文件执行COMMAND命令;此命令会交互式要求用户每次确认是否执行命令;
-exec COMMAND {}\; :对查找的文件执行COMMAND命令,但不会让用户确认是否执行此命令;
{}:用于引用查找到的文件名称自身;
注意:由于find命令查找的符合条件的文件一次性的传递给后面的命令;由于有时候执行的结果过于长,达到系统的限定值,所有就有了xargs命令的诞生;
3、xargs
由于很多命令不支持管道来传递参数,而时常有这个必要这样的操作,所有xargs命令就诞生;
作用:xargs用于产生某个命令的参数,可以读入stdin的数据,并且以空格符或者回车将stdin的数据分割成参数;
例如:如果想创建1000000个文件:
[root@centos7 ~]#touch f{1..1000000}
-bash: /usr/bin/touch: Argument list too long
如果这样操作的话,系统会告诉你参数太长。利用xargs这个命令很好的解决了这个问题;
[root@centos7 ~]#echo f{1..1000000} |xargs touch
[root@centos7 ~]#echo $?
0
利用这个命令就解决了刚刚的问题,对于一些数据量大的就很好的解决了。
4、示例:
介绍了这么多的命令,通过一些示例让大家进行深刻的理解:
1、查找/var目录下属主为root,且属组为mail的所有文件
[root@centos7 ~]#find /var -user root -a -group mail #find命令中默认是有-a的功能;
/var/spool/mail
/var/spool/mail/root
2、查找/var目录下不属于root、lp、gdm的所有文件
[root@centos7 ~]#find /var -not \( -user root -o -user lp -o -user gdm \)
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
[root@centos7 ~]#find /var -mtime -7 -not -user root -a -not -user postfix
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
[root@centos7 ~]#find -nouser -o -nogroup -a -atime -7
5、查找/etc目录下大于1M且类型为普通文件的所有文件
[root@centos7 ~]#find /etc -size +1 -type f -ls
6、查找/etc目录下所有用户都没有写权限的文件
[root@centos7 ~]#find /etc/ -not -perm /222
7、查找/etc目录下至少有一类用户没有执行权限的文件
[root@centos7 ~]#find /etc/ -not -perm /111
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
[root@centos7 ~]#find /etc/init.d/ -perm -111 -a -perm -002
补充:
如果不想查找某一个路径,方法如下:
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf”
-prune 删除
find /etc \(–path ‘/etc/sane.d’ –o –path ’/etc/fonts’ \) -a prune –o name “*.conf”
如果 -path “test” 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path “test” -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。