linux之查找命令find,locate

查找命令的使用

关于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            *.*

时间: 2024-10-12 22:55:32

linux之查找命令find,locate的相关文章

linux中查找命令find、locate、whereis、which、type区别

linux中查找命令find.locate.whereis.which.type区别 1. find Java代码 find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件.与查询数据库(/var/lib/locatedb)文件不同,find查找磁盘空间 find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> - <指定目录>: 所要搜索的目录及其所有子目录.默认为当前目录. - <指定条件>: 所要搜索的文件

Linux文件查找之find&locate

Linux文件查找之find&locate 一.概述 Linux系统核心的思想之一"一切皆文件",对于这么多的文件,如何快速查找过滤呢?下面我们就看看系统提供的文件查找命令find和locat,熟练使用find命令是运维人员的必经之路 二.find的用法及示例 1.find特点 查找速度略慢 精确查找 实时查找 只能搜索有读取和执行权限的目录 2.find用法 用法:find  [options]  [查找路径]  [ 查找条件]  [处理动作] 查找条件: 根据文件类型查找

linux文件查找命令之 find用法

linux文件系统文件查找命令:locate,find locate特性: 非实时查找:根据索引查找( 查找速度快,非精准查找,模糊查找) find特性: 实时查找:遍历所有文件进行条件匹配(精准查找,速度慢) find是生产环境常用命令 用法:  find [选项 ] [查找路径] [查找条件] [处理动作] 查找条件: 根据文件名查找: 支持使用通配字符 如: *,?,[],[^]等 -name"文件名称": -iname"文件名称":查找时忽略字符大小写 -u

Linux 文件查找命令find,xargs详述

Linux文件查找命令find,xargs详述     <exec 后期讲解> 关于find命令 由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下.即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限. 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统). 一.find 命令格式 1.find命令的一般形式为:

Linux文件查找命令find,xargs详述

转自:http://www.linuxsir.org/main/node/137本文进行了整理修订 Linux文件查找命令find,xargs详述 摘要: 本文是find 命令的详细说明,可贵的是针对参数举了很多的实例,大量的例证,让初学者更为容易理解:本文是zhyfly兄贴在论坛中:我对本文进行了再次整理,为方便大家阅读: 目录 版权声明 前言:关于find命令 一.find 命令格式 1.find命令的一般形式为: 2.find命令的参数: 3.find命令选项: 4.使用exec或ok来执

Linux文件查找命令find,xargs详述【转】

转自:http://blog.csdn.net/cxylaf/article/details/4069595 转自http://www.linuxsir.org/main/?q=node/137 Linux文件查找命令find,xargs详述 总结:zhy2111314来自:LinuxSir.Org整理:北南南北摘要: 本文是find 命令的详细说明,可贵的是针对参数举了很多的实例,大量的例证,让初学者更为容易理解:本文是zhyfly兄贴在论坛中:我对本文进行了再次整理,为方便大家阅读: 目录

Linux文件查找命令

1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> - <指定目录>: 所要搜索的目录及其所有子目录.默认为当前目录. - <指定条件>: 所要搜索的文件的特征. - <指定动作>: 对搜索结果进行特定的处理. 如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显

Linux的五个查找命令find,locate,whereis,which,type

Linux的五个查找命令 1. find 最常见且最强大的命令,可以查找任何文件. 格式 $ find   指定目录   指定条件   指定动作 指定目录: 所要搜索的目录及其子目录,默认当前目录. 指定条件: 所要搜索的文件的特征. 指定动作: 对搜索结果进行特定的处理. 提醒:如果什么参数都不给,find默认在当前目录及其子目录中 查找,并将所有结果返回到计算机的屏幕上. 例如: $ find .  -name ‘qq*’  -ls 在当前目录及其子目录下查找含有 ‘qq’打头的所有文件,并

Linux文件查找命令find用法整理(locate/find)

Linux文件查找查找主要包括:locate和find 1.locate 用法简单,根据数据库查找,非实时,用法: locate FILENAME 手动更新数据库(时间可能较长) updatedb 2.find 实时,精确,功能强大,用法: find 路径 查找标准 查找后动作 (1)路径:. 或者 ./ 均表示当前目录 (2)查找标准: -name 'FILENAME' 文件名精确匹配(支持通配符* ? []) -iname 'FILENAME' 文件名模糊匹配(不分大小写) -regex P