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

linux之查找命令find,locate

2017-08-12 17:36 323 查看
查找命令的使用关于locate和find的小知识。强调!关于locate和find都是对于搜索用户有读取和执行权限的目录才会进行搜索,也就是对搜索文件上级目录有权限时才能搜索到该文件。locate和find都是centos下查找的命令,但是两个却各有优缺,是什么咱们就一起来看一下吧。首先locate:命令格式locate后直接跟文件名就可以,还有两个选项(-i不区分大写 –n 后跟数字显示多少行 –r 后跟正则表达式)比如查找一个叫while的文件,在本机/app目录下有个叫while的文件,查找结果如下图。
[root@localhost ~]# 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却搜不出来
[root@localhost ~]# touch new.new
[root@localhost ~]# locate new.new
[root@localhost ~]#
[root@localhost ~]#

哇,突然感觉这电脑系统在调戏我,刚创建的文件你给我说啥都没搜出来,刚创建的文件创建到别人电脑上了吗!其实这个locate命令是在数据库中搜索的,全盘的数据都存在库中,而搜索只去库中搜索肯定比全盘搜索要快的多。但是这也是有一个很大的缺点局势没有时效性,新创建的文件是没有更新到库中所以搜索不出来的。在centos下/var/lib/mlocate/目录下有一个叫mlocate.db的文件就是库文件,每次查找就是在这个文件里面查找。当我把这个问价删除掉,无论查找什么都没有结果。
[root@localhost mlocate]# cd /var/lib/mlocate
[root@localhost mlocate]#
[root@localhost mlocate]# rm -rf mlocate.db
[root@localhost mlocate]# locate while
locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
[root@localhost mlocate]#

当新创建文件还想要搜索到时,这时候就要更新库文件了,有条命令叫updatedb,刚才我已经吧mlocate.db文件删掉了,但是执行了updatedb之后当前目录下又多出来了该文件,就是系统自动创建了库文件吧全盘信息搜索并储存到该文件里。如果存在该文件就更新该文件。(系统设置会自动更新该文件)
[root@localhost mlocate]# ls
[root@localhost mlocate]# updatedb
[root@localhost mlocate]# ls
mlocate.db
[root@localhost mlocate]#

最后在说说选项问题,举个正则的例子吧 其他都好理解。比如我想搜索以.sh结尾的文件,显示前十行。
[root@localhost 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
[root@localhost app]#

这里就可以用到正则表达式进行搜索速度快的一匹!find命令先说说他的优缺点:查找速度不如locate,精确查找,实时查找,搜索用户有执行读取权限的目录(前面已经说过了)。find的语法:find [选项] [路径] [条件] [处理动作]先简单的来搜索,慢慢深入进行处理动作。-name后跟文件名(在当前目录下有个文件叫:laji)
[root@localhost app]# find -name laji
./laji
[root@localhost app]#
-iname (不区分大小写的搜索文件名)
[root@localhost app]# find -iname laji
./LAJI
./laji
[root@localhost app]#

-user和-group (搜索app下属主和属组都是root的文件 后面的-ls在下面就不举例子了)
[root@localhost 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 后可以跟正则表达式来模糊搜索)
[root@localhost app]#  find  -name "*.sh"
./jiaozuoye31.sh
./while/reset31.sh
./zuoye/nologin31.sh
./zuoye/login31.sh
./zuoye/createyouhu31.sh
./zuoye/reset31.sh

-not (-not 后跟其他选项取反比如-user)
[root@localhost app]# find -not -user root
./new
[root@localhost app]#

-o 和 –a (两个意思相反 o=or a=and 一个是两个选项都满足,之个是只满足其中一个选项)
[root@localhost app]#  find /app/ -user  root  -o -user  centos  -ls
9306225    0 -rw-r--r--   1 centos   centos          0 Aug 10 18:01 /app/new
[root@localhost app]#
[root@localhost 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 +#代表大于#无上限也就是到正无穷,无限大)
[root@localhost 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
[root@localhost app]#
时间戳来查找是一样的(a,m,c)time 时间是区分跟大小雷同!-inum (inode号查找)
[root@localhost 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
[root@localhost app]# find -inum 9306155
./2017-07-27
[root@localhost app]#
-link # (根据硬连接数来查找查找连接数为#的文件)
[root@localhost 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
[root@localhost app]#
-type (根据文件类型来查找后跟 f普通文件d目录文件l符号链接文件s套接字文件b块设备c字符设备文件p管道文件) 这个就不举例子了,find -type f 查找普通文件 也算模糊搜索吧感觉用的不多!-perm (根据权限来查找,这个也有点意思)
/222    任何位置有写权限都会被匹配到

[root@localhost 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   所有位置都要有写权限才能被匹配
[root@localhost 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)

[root@localhost app]# find /app -perm 722 -ls
9306228    0 -rwx-w--w-   1 root     root            0 Aug 10 19:27 /app/111
[root@localhost app]#
下面都是查找文件后来操作的后缀选项:
-ls (查找文件后跟-ls显示到屏幕上,注意并不是bash里面的ls!这个-ls是find专用的选项 上面例子都用到了 -ls 不用-ls 只会输出文件名不会长列出)
下面就该说说了处理动作了,文件都找到了该怎么处理呢?
-delete :删除查找到的文件
两种方法:
1:
ian1
[root@localhost text1]# find -name user
./user
[root@localhost text1]# find -name user -delete
[root@localhost text1]# find -name user
[root@localhost text1]#
2:这种就是在查找后跟处理动作,利用rm命令删除
[root@localhost text1]# find -name wenjian1
./wenjian1
[root@localhost text1]# find -name wenjian1 -exec rm {} \;
[root@localhost text1]# find -name wenjian1
[root@localhost text1]#
-fls file :查找到的所有文件的长格式信息保存至指定文件中
[root@localhost text1]# find -name "wenjian*"
./wenjian
./wenjian2
./wenjian3
[root@localhost text1]# find -name "wenjian*" -fls wen;
[root@localhost text1]# ls
app   passwd  te  wen      wenjian2  while
pass  shuzi   tt  wenjian  wenjian3
[root@localhost 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
[root@localhost text1]#
处理动作后面两种形式 -ok 和-exec;ok需要确认exec不需要

格式为find..........-exec command {} \; command所需要执行的命令 {}表示前面所搜索的内容
上面rm删除就是其中的一种
比如要搜索批量修改文件名
每一次都需要确认
[root@localhost text1]# find -name "wen*"
./wenjian
./wenjian2
./wen
./wenjian3
[root@localhost text1]# find -name "wen*" -ok mv {} ./{}.doc \;
< mv ... ./wenjian > ? y
< mv ... ./wenjian2 > ? y
< mv ... ./wen > ? y
< mv ... ./wenjian3 > ? y
[root@localhost text1]# find -name "wen*"
./wenjian3.doc
./wen.doc
./wenjian2.doc
./wenjian.doc
[root@localhost text1]#
以上就是我对find的一点见解,若有不同请留言,一定不回!(开玩笑)

讲解不到之处,敬请谅解,欢迎补充!!!
0.0 *.*
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux find locate