查找命令的使用
关于locate和find的小知识。
强调!关于locate和find都是对于搜索用户有读取和执行权限的目录才会进行搜索,也就是对搜索文件上级目录有权限时才能搜索到该文件。
locate和find都是centos下查找的命令,但是两个却各有优缺,是什么咱们就一起来看一下吧。
首先locate:命令格式locate后直接跟文件名就可以,还有两个选项(-i不区分大写 –n 后跟数字显示多少行 –r 后跟正则表达式)比如查找一个叫while的文件,在本机/app目录下有个叫while的文件,查找结果如下图。
[[email protected] ~]# locate while /app/while /app/text1/while /app/while/ifs /app/while/w1 /app/while/w+f
我只是想找app下的while文件但是locate命令却把while目录里的文件都列举了一遍,这种搜索是模糊搜索但是也是全盘搜索,优点就是快和全,整个盘里有相关的都会列举出来(不管有用没用,这叫有点还是缺点还是因事而异吧)但是我下app目录下新创建了个文件叫new.new的普通文件,用locate却搜不出来
[[email protected] ~]# touch new.new [[email protected] ~]# locate new.new [[email protected] ~]# [[email protected] ~]#
哇,突然感觉这电脑系统在调戏我,刚创建的文件你给我说啥都没搜出来,刚创建的文件创建到别人电脑上了吗!其实这个locate命令是在数据库中搜索的,全盘的数据都存在库中,而搜索只去库中搜索肯定比全盘搜索要快的多。但是这也是有一个很大的缺点局势没有时效性,新创建的文件是没有更新到库中所以搜索不出来的。在centos下/var/lib/mlocate/目录下有一个叫mlocate.db的文件就是库文件,每次查找就是在这个文件里面查找。当我把这个问价删除掉,无论查找什么都没有结果。
[[email protected] mlocate]# cd /var/lib/mlocate [[email protected] mlocate]# [[email protected] mlocate]# rm -rf mlocate.db [[email protected] mlocate]# locate while locate: can not stat () `/var/lib/mlocate/mlocate.db‘: No such file or directory [[email protected] mlocate]#
当新创建文件还想要搜索到时,这时候就要更新库文件了,有条命令叫updatedb,刚才我已经吧mlocate.db文件删掉了,但是执行了updatedb之后当前目录下又多出来了该文件,就是系统自动创建了库文件吧全盘信息搜索并储存到该文件里。如果存在该文件就更新该文件。(系统设置会自动更新该文件)
[[email protected] mlocate]# ls [[email protected] mlocate]# updatedb [[email protected] mlocate]# ls mlocate.db [[email protected] mlocate]#
最后在说说选项问题,举个正则的例子吧 其他都好理解。
比如我想搜索以.sh结尾的文件,显示前十行。
[[email protected] app]# locate -r ".sh$" -n 10 /app/jiaozuoye31.sh /app/trash /app/while/reset31.sh /app/zuoye/argsnum31.sh /app/zuoye/checkdisk31.sh /app/zuoye/createuser31.sh /app/zuoye/createyouhu31.sh /app/zuoye/excute31.sh /app/zuoye/hostping31.sh /app/zuoye/login31.sh [[email protected] app]#
这里就可以用到正则表达式进行搜索速度快的一匹!
find命令先说说他的优缺点:查找速度不如locate,精确查找,实时查找,搜索用户有执行读取权限的目录(前面已经说过了)。
find的语法:find [选项] [路径] [条件] [处理动作]
先简单的来搜索,慢慢深入进行处理动作。
-name后跟文件名(在当前目录下有个文件叫:laji)
[[email protected] app]# find -name laji ./laji [[email protected] app]#
-iname (不区分大小写的搜索文件名)
[[email protected] app]# find -iname laji ./LAJI ./laji [[email protected] app]#
-user和-group (搜索app下属主和属组都是root的文件 后面的-ls在下面就不举例子了)
[[email protected] app]# find /app/zuoye/ –user root -group root -ls 9306158 4 drwxr-xr-x 3 root root 4096 Aug 8 14:37 /app/zuoye/ 9306184 4 -rwxr-xr-x 1 root root 325 Aug 3 21:13 /app/zuoye/nologin31.sh 9306187 4 -rwxr-xr-x 1 root root 316 Aug 3 21:12 /app/zuoye/login31.sh 9306192 4 drwxr-xr-x 2 root root 4096 Aug 4 04:12 /app/zuoye/1
-nouser和-nogroup(搜索没有属主和属组的文件,跟上面差不多!)
“正则表达式” (-name 后可以跟正则表达式来模糊搜索)
[[email protected] app]# find -name "*.sh" ./jiaozuoye31.sh ./while/reset31.sh ./zuoye/nologin31.sh ./zuoye/login31.sh ./zuoye/createyouhu31.sh ./zuoye/reset31.sh
-not (-not 后跟其他选项取反比如-user)
[[email protected] app]# find -not -user root ./new [[email protected] app]#
-o 和 –a (两个意思相反 o=or a=and 一个是两个选项都满足,之个是只满足其中一个选项)
[[email protected] app]# find /app/ -user root -o -user centos -ls 9306225 0 -rw-r--r-- 1 centos centos 0 Aug 10 18:01 /app/new [[email protected] app]#
[[email protected] app]# find /app/ -user root -a -group root -ls 9306113 4 drwxr-xr-x 12 root root 4096 Aug 10 18:58 /app/ 9306142 4 drwxr-xr-x 2 root root 4096 Jul 20 17:50 /app/text1 9306148 4 -rw-r--r-- 1 root root 58 Jul 20 16:54 /app/text1/shuzi 9306141 0 -rw-r--r-- 1 root root 0 Jul 20 17:50 /app/text1/wenjian
-size (这个就有意思了后面跟的是文件大小:单位有K,M,G,c)
find /app/ -size # (#代表区间(#-1,#] -#代表小于#-1 +#代表大于#无上限也就是到正无穷,无限大)
[[email protected] app]# find -size 2k -ls 7869424 4 -rw-r--r-- 1 root root 1433 Jul 16 19:23 ./text/tt/tt/tt/tt/passwd 9306116 4 -rw-r--r-- 1 root root 1433 Jul 15 14:30 ./text/mima 9306114 4 -rw-r--r-- 1 root root 1433 Jul 16 16:19 ./text/passwd 9306152 4 -rwxr-xr-x 1 root root 1553 Aug 4 20:55 ./zuoye/createuser31.sh [[email protected] app]#
时间戳来查找是一样的(a,m,c)time 时间是区分跟大小雷同!
-inum (inode号查找)
[[email protected] app]# ls -i 9306155 2017-07-27 9306175 if 9306137 text 9306153 2017-08-01 9306179 jiaozuoye31.sh 9306142 text1 9306168 2017-08-02 9306198 laji 9306188 trash 9306157 2017-08-03 9306227 LAJI 9306149 while 9306201 cj 9306225 new 9306158 zuoye 9306172 functions 9306224 new.new [[email protected] app]# find -inum 9306155 ./2017-07-27 [[email protected] app]#
-link # (根据硬连接数来查找查找连接数为#的文件)
[[email protected] app]# find -links 3 -ls 9306188 4 drwxr-xr-x 3 root root 4096 Aug 10 10:01 ./trash 9306130 4 drwxr-xr-x 3 root root 4096 Jul 17 15:07 ./text/tt/tt 9306133 4 drwxr-xr-x 3 root root 4096 Jul 17 15:07 ./text/tt/tt/tt 9306158 4 drwxr-xr-x 3 root root 4096 Aug 8 14:37 ./zuoye [[email protected] app]#
-type (根据文件类型来查找后跟 f普通文件d目录文件l符号链接文件s套接字文件b块设备c字符设备文件p管道文件)
这个就不举例子了,find -type f 查找普通文件 也算模糊搜索吧感觉用的不多!
-perm (根据权限来查找,这个也有点意思)
/222 任何位置有写权限都会被匹配到 [[email protected] app]# find /app/zuoye/ -perm /222 -ls 9306158 4 drwxr-xr-x 3 root root 4096 Aug 8 14:37 /app/zuoye/ 9306184 4 -rwxr-xr-x 1 root root 325 Aug 3 21:13 /app/zuoye/nologin31.sh 9306187 4 -rwxr-xr-x 1 root root 316 Aug 3 21:12 /app/zuoye/login31.sh 9306192 4 drwxr-xr-x 2 root root 4096 Aug 4 04:12 /app/zuoye/1 9306178 4 -rwxr-xr-x 1 root root 679 Aug 5 00:40 /app/zuoye/createyouhu31.sh 9306186 4 -rwxr-xr-x 1 root root 609 Aug 8 14:37 /app/zuoye/reset31.sh -222 所有位置都要有写权限才能被匹配 [[email protected] app]# find /app -perm -222 -ls 9306206 0 -rwxrwxrwx 1 root root 0 Aug 9 11:17 /app/trash/3 9306217 0 -rwxrwxrwx 1 root root 0 Aug 9 21:47 /app/trash/1234/3 9306216 0 -rwxrwxrwx 1 root root 0 Aug 9 21:47 /app/trash/1234/2 9306205 0 -rwxrwxrwx 1 root root 0 Aug 9 11:17 /app/trash/2 722 什么都不加的情况之能给什么权限匹配什么权限(只能是722) [[email protected] app]# find /app -perm 722 -ls 9306228 0 -rwx-w--w- 1 root root 0 Aug 10 19:27 /app/111 [[email protected] app]#
下面都是查找文件后来操作的后缀选项:
-ls (查找文件后跟-ls显示到屏幕上,注意并不是bash里面的ls!这个-ls是find专用的选项 上面例子都用到了 -ls 不用-ls 只会输出文件名不会长列出)
下面就该说说了处理动作了,文件都找到了该怎么处理呢?
-delete :删除查找到的文件
两种方法: 1: ian1 [[email protected] text1]# find -name user ./user [[email protected] text1]# find -name user -delete [[email protected] text1]# find -name user [[email protected] text1]# 2:这种就是在查找后跟处理动作,利用rm命令删除 [[email protected] text1]# find -name wenjian1 ./wenjian1 [[email protected] text1]# find -name wenjian1 -exec rm {} \; [[email protected] text1]# find -name wenjian1 [[email protected] text1]#
-fls file :查找到的所有文件的长格式信息保存至指定文件中
[[email protected] text1]# find -name "wenjian*" ./wenjian ./wenjian2 ./wenjian3 [[email protected] text1]# find -name "wenjian*" -fls wen; [[email protected] text1]# ls app passwd te wen wenjian2 while pass shuzi tt wenjian wenjian3 [[email protected] text1]# cat wen 9306141 0 -rw-r--r-- 1 root root 0 Jul 20 17:50 ./wenjian 9306146 0 -rw-r--r-- 1 root root 0 Jul 20 17:31 ./wenjian2 9306151 4 -rw-r--r-- 1 root root 31 Jul 20 17:50 ./wenjian3 [[email protected] text1]#
处理动作后面两种形式 -ok 和-exec;ok需要确认exec不需要
格式为find..........-exec command {} \; command所需要执行的命令 {}表示前面所搜索的内容
上面rm删除就是其中的一种
比如要搜索批量修改文件名
每一次都需要确认 [[email protected] text1]# find -name "wen*" ./wenjian ./wenjian2 ./wen ./wenjian3 [[email protected] text1]# find -name "wen*" -ok mv {} ./{}.doc \; < mv ... ./wenjian > ? y < mv ... ./wenjian2 > ? y < mv ... ./wen > ? y < mv ... ./wenjian3 > ? y [[email protected] text1]# find -name "wen*" ./wenjian3.doc ./wen.doc ./wenjian2.doc ./wenjian.doc [[email protected] text1]#
以上就是我对find的一点见解,若有不同请留言,一定不回!(开玩笑)
讲解不到之处,敬请谅解,欢迎补充!!!
0.0 *.*