一、Linux中的文件查找工具
在文件系统上常常需要根据文件的各种属性去查找符合条件的文件,此前讲到的grep、egrep属于文本过滤、文本搜索工具;而文本查找工具有两个,local和find
二、Linux中的查找工具简介 locate 命令 find 命令 简介:locate属于非实时查找,依赖于事先构建的索引;索引的创建是在空闲时由系统自行进行(周期性任务);手动更新数据库进行使用update命令;索引构建过程需要遍历整个根文件系统,及其耗费资源 简介:find属于实时查找工具,通过遍历指定路径下的文件系统完成文件查找 特点:查找速度快、模糊查找、非实时查找、搜索的是文件的全路径,不仅仅是文件名、可能只搜索用户具备读取和执行权限的目录 特点:查找速度略慢、精确查找、实时查找、可能只搜索用户具备读取和执行权限的目录
三、locate和find的使用
locate 命令
简介: locate - find files by name格式: locate [OPTION]... PATTERN...选项: -i:执行区分大小写的搜索 •-n N:只列举前N个匹配项目示例: locate foo:搜索名称或路径中带有“foo”的文件 locate -r ‘\.foo$’:使用Regex来搜索以“.foo”结尾的文件举例: [root@centos6 ~]# locate -n 3 passwd # 只匹配字符串passwd到第三个目录 /etc/passwd /etc/passwd- /etc/pam.d/passwd [root@centos6 ~]# [root@centos6 ~]# mv /var/lib/mlocate/mlocate.db ./ # locate是基于mlocate.db文件查找的 [root@centos6 ~]# locate -n 3 passwd locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory [root@centos6 ~]#
find 命令
简介: find - search for files in a directory hierarchy格式: find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]选项: (1)根据文件名和inode查找 -name "文件名称":支持使用glob;*, ?, [], [^] -iname"文件名称":不区分字母大小写 -inumn:按inode号查找 -samefilename:相同inode号的文件 -links n:链接数为n的文件 -regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称 (2)根据属主、属组查找 -user USERNAME:查找属主为指定用户(UID)的文件 -group GRPNAME: 查找属组为指定组(GID)的文件 -uidUserID:查找属主为指定的UID号的文件 -gidGroupID:查找属组为指定的GID号的文件 -nouser:查找没有属主的文件 -nogroup:查找没有属组的文件 (3)根据文件类型查找 格式:-type TYPE f: 普通文件 d: 目录文件 l: 符号链接文件 s:套接字文件 b: 块设备文件 c: 字符设备文件 p: 管道文件 (4)组合条件 与:-a 或:-o 非:-not, ! 德·摩根定律:(非P) 或(非Q)= 非(P 且Q);(非P) 且(非Q) = 非(P 或Q) 示例:!A -a !B = !(A -o B);!A -o !B = !(A -a B) (5)根据文件大小来查找 -size [+|-]#UNIT 常用单位:k, M, G #UNIT: (#-1, #]:如:6k 表示(5k,6k] -#UNIT:[0,#-1]:如:-6k 表示[0,5k] +#UNIT:(#,∞):如:+6k 表示(6k,∞) (6)根据时间戳 以“天”为单位; -atime [+|-]# #: [#,#+1) +#: [#+1,∞] -#: [0,#) -mtime [+|-]# #: [#,#+1) +#: [#+1,∞] -#: [0,#) -ctime [+|-]# #: [#,#+1) +#: [#+1,∞] -#: [0,#) 以“分钟”为单位: -amin [+|-]# #: [#,#+1) +#: [#+1,∞] -#: [0,#) -mmin [+|-]# #: [#,#+1) +#: [#+1,∞] -#: [0,#) -cmin [+|-]# #: [#,#+1) +#: [#+1,∞] -#: [0,#) (7)根据权限查找 格式: -perm [/|-]MODE MODE: 精确权限匹配 /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰 -MODE:每一类对象都必须同时拥有指定权限,与关系0 表示不关注 示例: find -perm 755:会匹配权限模式恰好是755的文件 只要当任意人有写权限时,find -perm +222就会匹配 只有当每个人都有写权限时,find -perm -222才会匹配 只有当其它人(other)有写权限时,find -perm -002才会匹配 (8)处理动作 -print:默认的处理动作,显示至屏幕 -ls:类似于对查找到的文件执行“ls -l”命令 -delete:删除查找到的文件 -flsfile:查找到的所有文件的长格式信息保存至指定文件中 -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认 -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令 {}: 用于引用查找到的文件名称自身 find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令 Note:有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题;find | xargsCOMMAND示例1: find -name snow.png #搜索名为snow.png的文件 find -iname snow.png #不分大小写地搜索名为snow.png、Snow.png、SNOW.PNG等等的文件 find / -name “*.txt” #查找根目录下,以".txt"结尾的文件 find /var –name “*log*” #查找"/var"目录下,中间跟了"log"单词的文件 find -user joe -groupjoe #查找用户joe 以及组群joe所拥有的文件 find -user joe -not -groupjoe #查找用户joe 但是组群不是joe所拥有的文件 find -user joe -o -user jane #查找用户joe 或者组群是jane所拥有的文件 find -not \( -user joe -o -user jane \) #查找不是用户joe 且组群不是jane所拥有的文件 find / -user joe -o -uid 500 #查找不是用户joe 或者组群不是用户id500所拥有的文件示例2: (1)找出/tmp目录下,属主不是root,且文件名不以f开头的文件 find /tmp\( -not -user root -a -not -name 'f*' \) -ls find /tmp-not \( -user root -o -name 'f*' \) –ls (2)排除目录 示例:查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件 find /etc-path ‘/etc/sane.d’ -a -prune -o -name “*.conf” -print示例3: find -name “*.conf” -exec cp {} {}.org \; #备份配置文件,添加.orig这个扩展名 find/tmp-ctime+3-userjoe-okrm{}\; #提示删除存在时间超过3天以上的joe的临时文件 find~-perm-002 -execchmodo-w{}\; #在你的主目录中寻找可被其它用户写入的文件 find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \; #查找/data目录下的文件类型为普通文件且权限为644,名称以".sh"结尾文件,最后查找的文件权限更改为755 find /home –type d -ls #查找/home目录下文件类型为目录的文件,并以长格式显示文件
四、作业
1、查找/var目录下属主为root,且属组为mail的所有文件
[root@centos6 ~]# find /var/ -user root -group mail /var/spool/mail [root@centos6 ~]#2、查找/var目录下不属于root、lp、gdm的所有文件
[root@centos6 ~]# find /var/ -not \( -user root -o -user lp -o -user gdm \)3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
[root@centos6 ~]# find /var/ -mtime -7 -not \( -user root -o -user postfix \)4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
[root@centos6 ~]# find / \( -nouser -o -nogroup \) -mtime -75、查找/etc目录下大于1M且类型为普通文件的所有文件
[root@centos6 ~]# find /etc/ -size +1M -type f6、查找/etc目录下所有用户都没有写权限的文件
[root@centos6 ~]# find /etc/ -perm -2227、查找/etc目录下至少有一类用户没有执行权限的文件
[root@centos6 ~]# find /etc/ -perm +118、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
[root@centos6 ~]# find /etc/init.d/ -perm -113
五、总结
1、总结find的德.摩根定律及应用示例
(1)详解
德.摩根定律 find的德.摩根定律 (非 P) 或 (非 Q) = 非(P 且 Q) find /var/ -not -user root -o -not -user mail = find /var/ -not \( -user root -a -user mail \) (非 P) 且 (非 Q) = 非(P 或 Q) find /home/ -not -user root -a -not -user nginx = find /home/ -not \( -user root -o -user nginx \) (2)示例
例子1: [root@centos6 ~]# find /tmp/ -not -user nginx -not -user root #查找‘/tmp目录下属主不是root且不是nginx的文件’ /tmp/pulse-SGeqTq3cfHFi /tmp/orbit-gdm /tmp/orbit-gdm/linc-2593-0-6447e99080a09 /tmp/orbit-gdm/linc-25bb-0-3306608dc8c8a /tmp/orbit-gdm/linc-25b3-0-607a875fbe5b6 /tmp/orbit-gdm/linc-25b4-0-1da9ddb2bdf32 /tmp/orbit-gdm/linc-25f0-0-13bd5772d233c /tmp/orbit-gdm/linc-25af-0-78f6404cb32fd /tmp/orbit-gdm/linc-258a-0-7aaa4b2481edf /tmp/orbit-gdm/linc-25b2-0-6bd1688dbe162 /tmp/orbit-gdm/linc-25a4-0-1a415a8da0574 /tmp/orbit-gdm/linc-25b1-0-290420a7be495 /tmp/orbit-gdm/linc-25b0-0-27f32254bb463 [root@centos6 ~]# find /tmp/ -not \( -user nginx -o -user root \) #使用摩根定律简写 /tmp/pulse-SGeqTq3cfHFi /tmp/orbit-gdm /tmp/orbit-gdm/linc-2593-0-6447e99080a09 /tmp/orbit-gdm/linc-25bb-0-3306608dc8c8a /tmp/orbit-gdm/linc-25b3-0-607a875fbe5b6 /tmp/orbit-gdm/linc-25b4-0-1da9ddb2bdf32 /tmp/orbit-gdm/linc-25f0-0-13bd5772d233c /tmp/orbit-gdm/linc-25af-0-78f6404cb32fd /tmp/orbit-gdm/linc-258a-0-7aaa4b2481edf /tmp/orbit-gdm/linc-25b2-0-6bd1688dbe162 /tmp/orbit-gdm/linc-25a4-0-1a415a8da0574 /tmp/orbit-gdm/linc-25b1-0-290420a7be495 /tmp/orbit-gdm/linc-25b0-0-27f32254bb463 [root@centos6 ~]#例子2: [root@centos6 ~]# find /var/mail/ -not -user root -o -not -user mail #查找/var/mail/目录下属主不属于root或者不属于mail用户的文件 /var/mail/ /var/mail/zabbix /var/mail/nginx /var/mail/rpc [root@centos6 ~]# find /var/mail/ -not \( -user root -a -user mail \) #使用摩根定律简写 /var/mail/ /var/mail/zabbix /var/mail/nginx /var/mail/rpc [root@centos6 ~]#2、find 条件权限perm
(1)find命令中的条件权限查找分为三种:
格式:find [option] [arguments] -perm MODE 精确权限匹配设置的权限 格式:find [option] [arguments] -perm /MODE 任何一类(u,g,o)对象的权限中只要能一位匹配即可 格式:find [option] [arguments] -perm -MODE 每一类对象都必须同时拥有为其指定的权限标准 (2)示例
例子1: [root@centos6 ~]# find /var/ -type f -perm 755 -ls #查找/var/目录下权限为755的普通文件 1050258 4 -rwxr-xr-x 1 root root 28 Jul 20 2009 /var/lib/cas/snippets/log 1050261 4 -rwxr-xr-x 1 root root 49 Jul 20 2009 /var/lib/cas/snippets/sys 1050262 4 -rwxr-xr-x 1 root root 178 Jul 20 2009 /var/lib/cas/snippets/template 1050259 4 -rwxr-xr-x 1 root root 57 Jul 20 2009 /var/lib/cas/snippets/memory 1050263 4 -rwxr-xr-x 1 root root 59 Jul 20 2009 /var/lib/cas/snippets/traceback 1050260 4 -rwxr-xr-x 1 root root 32 Jul 20 2009 /var/lib/cas/snippets/modules [root@centos6 ~]#例子2: [root@centos6 ~]# find /tmp/ -type f -perm +222 -ls #查找/tmp目录下其中一位用户有写权限的普通文件 6029349 4 -rw------- 1 nginx nginx 5 Aug 6 18:24 /tmp/pulse-64i6puSV0XaK/pid 6029314 0 -rw------- 1 root root 0 Aug 6 17:34 /tmp/yum.log 6029347 0 -rwx------ 1 nginx nginx 0 Aug 6 18:24 /tmp/orbit-nginx/bonobo-activation-register-9a6315bfd3b742666cd7967900000293.lock 6029356 4 -rw-rw-r-- 1 nginx nginx 629 Aug 6 18:24 /tmp/orbit-nginx/bonobo-activation-server-9a6315bfd3b742666cd7967900000293-ior [root@centos6 ~]#例子3: [root@centos6 ~]# find /boot/ -type f -perm -111 -ls #查找/boot/目录下所有用户必须有执行权限的普通文件 22 250 -rwxr-xr-x 1 root root 254279 Mar 22 23:59 /boot/efi/EFI/redhat/grub.efi 18 4166 -rwxr-xr-x 1 root root 4264528 May 11 01:32 /boot/vmlinuz-2.6.32-642.el6.x86_64
原创文章,作者:Aleen,如若转载,请注明出处:http://www.178linux.com/36072