文件查找命令之locate、find简析
在工作中经常会在文件系统上查找符合条件的文件,今天学习了文件查找命令,在此简析locate和find两个文件查找工具。
一、杂项知识整理
1、find的选项-user的实质是通过UID查找,如果两个用户的UID相同,其会显示两个用户的所有符合条件的文件。
2、查找时-name "*.txt"中的文件名必须加双引号。
3、find查找的时候,如果对象是个目录的软链接,需要加/,如果不加/则默认把目录看做一个文件进行查找,加了/之后会通过链接进入真是目录中进行文件的查找,例如:
[root@localhost etc]# find /etc/rc3.d -perm /200 /etc/rc3.d [root@localhost etc]# find /etc/rc3.d/ -perm /200 /etc/rc3.d/ /etc/rc3.d/K50netconsole /etc/rc3.d/S10network
4、按时间和大小查找的图解:
二、命令详解及事例
1、locate命令:在文件系统上查找符合条件的文件:
依赖于实现构建好的索引库,其索引库是系统自动建立并周期性自动更新的,手动更新数据库用updatedb。
工作特性:查找速度快,模糊查找,非实时查找,更新数据库索引需要遍历整个根文件系统,极其消耗系统资源。
-b 只查找路径中的基名
-r 扩展正则表达式
-c 统计出共多少个符合条件,-bc
-w 路径名
-i 忽略字符大小写
-n # 只列举前#个匹配项目
[root@localhost ~]# locate -c *.sh 2 [root@localhost ~]# locate *.sh /root/a.sh /root/a.sh.bak [root@localhost ~]# updatedb
2、find命令:实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找。
工作特性:查找速度略慢,精确查找,实时查找
用法:find [查找起始路径] [查找条件] [执行动作]
起始路径:默认当前目录
条件:指定的查找标准,大小类型从属关系等
动作:对符合条件的文件作出的操作,例如删除等,默认为输出至标准输出,-print
-name “PATTERN”
-iname "PATTERN"
支持glob风格的通配符;
-regex PATTERN
基于正则表达式模式查找文件,匹配的是整个路径,而非其名
-user NAME 查找属主指定用户的所有文件
-group NAME 查找属组指定用户的所有文件
-uid NUM 指定UID的所有文件
-gid NUM
-nouser 查找没有属主的用户的所有文件
-nogroup 查找没有属组的用户的所有文件
-type TYPE
f d l b c字符设备文件 p s
组合逻辑:
-a 与
-o 或
-not或!非
按文件大小查找
-size NUM
-NUM
+NUM
按时间查找:以天为单位:
-atime 访问时间
# -# +#
-mtime -ctime
以分钟为单位
-amin 访问时间 -mmin 修改时间 -cmin改变时间
根据权限匹配
-perm /mode 任何一类用户的权限中的任何一位符合条件即满足
-mode 每一类用户的权限中的每一位同时符合条件即满足
mode 精确权限匹配
处理动作:
-print 输出标准输出,默认的动作
-ls 类似于对查找到的文件执行ls -l命令,输出详细信息
-delete 删除查找到的文件
-fls /PATH/FILE 保存至指定路径文件中
-ok COMMAND {}\; 对查找到的每个文件执行由COMMAND表示的命令,每次由用户确认;
-exec COMMAND {}\; 对查找到的每个执行由COMMAND表示的命令,直接执行不需要确认。
find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令,但是有些命令不能接受过长的参数,此时命令执行会失败,另一种方式可以规避此问题:
xargs命令:xargs是一条unix和类unix操作系统的常用命令,他的作用是将参数列表转换成小块分段传递给其他命令,以避免参数该列表过长的问题。
find | xargs COMMAND
用xargs实现多参数的命令处理:xargs -i{} COMMAND
[root@localhost tmp]# find /testdir/shelltest/ -name m* | xargs -i{} cp {} ./ [root@localhost tmp]# ls mysh10.sh mysh13.sh mysh16.sh mysh19.sh mysh21.sh mysh4.sh mysh7.sh
避开某个目录:-prune,例如:
find /etc -path ‘/etc/sane.d’ (-a) -prune -o -name "*.conf
-prune就像一个判断语 句,当发现-prune前面的表达式math时,执行到-prune之后就会输出一个1结果,如果shell的话,可以使用echo $?来看结果,如果-prune后面跟的是-o选项,用c语言的语法来讲的话就是1 || -print,所以明显可以看到当-prune前面的 表达式成立的话,就不会执行-o后面的内容了,如果不成立,即0 || -print,那么将打印输出,另外需要注意的是-path路径不能加入 结尾的/,比如路径/vobs/gliethttp/signature,不能写成/vobs/gliethttp/signature/如果find .那么后面-path的必须使用相对路径./gliethttp除 find中.之外,其他所有查找,比如find tmp或者find /vobs等,-path都必须使用绝对路径。
[root@localhost test]# ls ch.sh mysh13.sh.bak mysh17.sh.bak mysh20.sh.bak mysh4.sh.bak mysh8.sh.bak mysh10.sh.bak mysh14.sh.bak mysh18.sh.bak mysh21.sh.bak mysh5.sh.bak mysh9.sh.bak [root@localhost test]# cd .. [root@localhost tmp]# ls mysh10.sh mysh13.sh mysh16.sh mysh19.sh mysh21.sh mysh4.sh mysh7.sh test mysh11.sh mysh14.sh mysh17.sh mysh1.sh mysh2.sh mysh5.sh mysh8.sh
[root@localhost tmp]# find ./ -path ./test -prune -o -name "my*" ./mysh7.sh ./mysh14.sh ./mysh18.sh ./mysh20.sh
3、德摩根定律:
三、课后练习
1、查找/var目录下属主为root,且属组为mail的所有文件
find /var -user root -group mail
2、查找/var目录下不属于root、lp的所有文件
find /var -not \( -user root -o -user lp \) -ls
3、查找/var目录下最近一周内其内容被修改过,同时属主不root也不是postfix
find /var/ -mtime -7 -not -user root -not -user postfix -ls
4、查找当前系统上没有属主或属组,且最近一周内被访问过的文件
find / -nouser -nogroup -atime -7
5、查找/etc目录下大于1M且类型为普通文件的所有文件
find /etc/ -size +1M -type f
6、查找/etc目录下所有用户都没有写权限的文件
[root@localhost tmp]# find /etc/ -not -perm /222 -ls 50740639 196 -r--r--r-- 1 root root 198453 7月 19 04:57 /etc/pki/ca-trust/extracted/java/cace rts464249 352 -r--r--r-- 1 root root 359773 7月 19 04:57 /etc/pki/ca-trust/extracted/openssl/ca- bundle.trust.crt17127677 264 -r--r--r-- 1 root root 266702 7月 19 04:57 /etc/pki/ca-trust/extracted/pem/tls-c a-bundle.pem
7、查找/etc目录下至少有一类用户没有执行权限的文件;至少一类用户没有,包含全没有,或者任意一类用户或者两类用户有,全都有取反
[root@localhost init.d]# find /etc/init.d/ -not -perm -111 -ls 34178284 4 -rw-r--r-- 1 root root 1160 11月 20 2015 /etc/init.d/README 34220229 16 -rw-r--r-- 1 root root 13948 9月 16 2015 /etc/init.d/functions
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件。
[root@localhost init.d]# find /etc/init.d/ -perm -113 /etc/init.d/
原创文章,作者:SilencePavilion,如若转载,请注明出处:http://www.178linux.com/34310