您的位置:首页 > 运维架构 > Linux

linux中find命令的使用

2017-07-31 20:22 197 查看
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,或逻辑表达式为真。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux find 查找 文件 搜索