linux之查找命令find,locate

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux之查找命令find,locate相关的知识,希望对你有一定的参考价值。

查找命令的使用

关于locatefind的小知识。

强调!关于locatefind都是对于搜索用户有读取和执行权限的目录才会进行搜索,也就是对搜索文件上级目录有权限时才能搜索到该文件。

locatefind都是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 (这个就有意思了后面跟的是文件大小:单位有KMGc

              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]#

时间戳来查找是一样的(amctime        时间是区分跟大小雷同!

-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!这个-lsfind专用的选项    上面例子都用到了 -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            *.*


本文出自 “mlon客” 博客,请务必保留此出处http://13154101.blog.51cto.com/13144101/1955782

以上是关于linux之查找命令find,locate的主要内容,如果未能解决你的问题,请参考以下文章

Linux文件查找命令之locate与find

linux的查找命令 find whereis locate

Linux文件查找工具之find “大宝剑”

Linux命令之查找文件locate

Linux命令之查找文件locate

Linux之locate命令