find、locate详细解析

文件查找

在linux系统中如果我们不知道具体的文件的具体位置,我们可以使用文件查找命令来找到我们想找的文件,linux中也有相当优秀的查找命令,(如locate、find),通常查找速度快是locate,因为它是利用数据库查找的,所以速度很快,而find是全磁盘扫描进行查找,所以速度比较慢。

locate和find都是在文件系统上查找符合条件的文件含义。

区别:locate速度快,但如果新添加的文件需要更新其数据可才能找到,

      find速度慢,但随时可全面找到,功能比locate强大。

下面说一说具体用法~~~

locate(查找、定位)

        依赖于事先构建好的索引库;系统自动周期性的更新其数据库

        手动更新数据库命令:updatedb

                updatedb根据/etc/uodatedb.conf的设置去查看系统硬盘内的文件名,并更新/var/lib/mlocate内的数据库文件

        非实时查找(如果新创建的文件还没有被数据库更新到,那么就找不到此文件,必须为locate的数据可更新到其数据库才能实现查找)

        依赖于数据库:/var/lib/mlocate/mlocate.db

locate工作特性:

     非实时查找

     查找速度快

     进行模糊查找

        把所有的字符或关键字匹配库中的每一个路径,路径中的任何一个位置不光是文件名,但凡出现匹配的字符串都认为是符合条件的。


locate [option]… [PATTERN]…

-b:只匹配路径中的基名
-c:统计出共有多少个符合条件的文件
-r:支持正则表达式
-i:执行区分大小的搜索

结论:locate功能不大,但查找速度很快

例:查找系统中所有与passwd相关的文件名

[root@CentOS 7 ~]# locate passwd
/etc/.passwd.swp
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
………下面省略………

find(发现找到)

实时查找工具,通过遍历指定起始路径下文件系统层级结构完成查找

    工作特性:

     查找速度略慢

     精确查找

     实时查找

    

用法:  find [options ] [查找起始路径]  [查找条件] [处理动作]


查找起始路径:指具体搜索目标的开始路径,默认为当前目录

查找条件:指定查找标准,可以根据文件名、大小、类型、从属关系、权限等标准。默认为找出指定条件的所有文件

处理动作:对符合查找条件的文件进行额外的操作,例如删除等操作,默认为输出至标准输出

查找起始路径

    指定需要对那个目录进行查找

例:查找/etc/sysconfig下所有以network开头的文件

 #find  /etc/sysconfig   -name  "*network*"
   其中/etc/sysconfig   就是要查找的路径

查找条件:

    根据文件名查找(注意:文件名必须加引号)

-name   PATTERN : 查找文件名,可以使用glob风格的通配符来进行模糊查找

-iname  PATTERN : 不区分大小写的查找文件名,也可使用glob风格的通配符查找

glob风格的通配符

*、?、[ ] 、[ ^ ]

#find   /etc/ -iname "passwd"    //不区分大小写的前提下在/etc/目录下查找passwd文件

根据文件从属关系

    -user  username :查找属主为指定用户的所有文件
    -group groupname :查找属组为指定组的所有文件
    -nouser :查找没有属主的文件
    -nogroup :查找没有属组的文件
    -uid  UID :查找指定的UID的所有文件
    -gid GID: 查找指定GID的所有文件

根据文件类型查找

    -type TYPE

        TYPE:s:套接字文件、f:普通文件、L/h符号链接文件、c:字符设备文件、 d:目录文件、b:块设备文件、p:管道文件


组合测试:

    与:-a 必须两者满足才行(默认组合的逻辑 ) 

 #find /tmp -nouser -a  -type f -ls
        显示/tmp目录下没有属主并且为普通的文件的文件

    或:-o 满足一个条件即可

    #find /tmp -nouser -o  -type f -ls
        显示/tmp目录下没有属主或者为普通的文件的文件

    非:-not/!   条件取反

 !A -a !B =! (A -o B) 
        !A -o !B =! (A -a B)

根据文件的大小查找:

-size [+|-] n  UNIT(单位)

常用单位:k/M/G

-size  10k :查找等于10k的文件(9k以上到10k以下之间的文件)

-size  +10k: 查找大于10k的文件(不包括10k,10k以上)

-size -10k:查找小于10k的文件(包括10k及以下)

根据时间戳查找:

以天为单位:可使用n、+n、-n  (n为数字)

-atime(access)
-mtime(mtime)
-ctime(ctime)

以分钟为单位:可使用n、+n、-n(n为数字)

amin
mmin
cmin

下面以mtime来具体解释一下

-mtime n :n为数字,意义为在n天之前的“一天之内”被更改过的文件

-mtime +n:在n天之前(不包含n天本身) 被更改过的文件名

-mtime -n:在n天之内(含n天本身)被更改过的文件名

blob.png

图中最右边为当前时间,越往左边则越代表越早之前的时间轴。由此可以知道:

+4代表大于等于5天前的文件名: find  /var -mtime +4

-4代表小于等于4天内的文件名: find /var -mtime -4

4代表4~5那一天内的文件名:find /var -mtime 4

例:1、找出4天内被改动过的文件名

    find  /var -mtime -4

    2、找出4天前的那一天被改动过的文件名

    find /var -mtime 4

根据权限查找:

-perm [/|-] mode

    -perm    mode :精确权限匹配

    #find  /   -perm  644          //查找根下权限为644的文件

    -perm     /mode :任何一类用户(u、g、o)的权限中任何一位(r、w、x)符合条件就满足

    #find   /  -perm  666         //三类用户中只要有一类用户能满足6(rw-)即可满足

    -perm    -mode  :每一类用户(u、g、o)的权限中每一位(r、w、x)都必须符合条件就满足

    #find   /  -perm   -222     //三类用户中都必须拥有写权限即可满足

注意:权限为上如果使用如:-200  ,0则表示忽略相对应的用户的权限检查

处理动作:

-print:输出至标准输出,此为默认动作

-ls:劣质于对查找到的文件执行”ls -l“命令,输出文件的详细信息

-delete:删除查找到的文件

-fls  /path/to/somefile:把查找到的所有文件的显示出来的详细信息保存至指定文件中

 #find  /   -perm 7000  -fls  /test/perm.txt
    //将根下特殊权限是7(suid、sgid、sticky)的文件的详细信息保存到/test/perm.txt文件中

-ok   command {}  \; :对查找到的每个文件执行由command指定的命令

其中:{ } 此表示前面find查找到的内容,
      \ ;则表示-ok命令结束 ,斜杠“\”是为后面的分号";"转义
#find  ./  -nouser -a -nogroup  -ok chown root:root {} \;
//将当前目录下既没有属主也没有属组的文件执行chown命令将其属主属组改为root,

-exec command {} \;    :对查找到的所有文件执行由command指定的命令

#find   ./ -perm /002 -exec mv { } { }.danger \;
      //将当前目录下其他用户权限为2(因为属主属组为0,即忽略匹配)的文件移动到当前文件并更名为当前名加" .danger"后缀。

注意:

    1、-ok 和 -exec的区别在与-ok每次对文件执行命令是会跟用户交互操作,而-exec则直接把查找到的文件执行指定的命令,不和用户交互

    2、find 传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令,但是有些命令不能接受过长的参数,此时命令执行失败,另一种方式可躲避此问题,(find | xarg command),xarg 则表示把命令的参数转换为一个一个字符传给命令

原创文章,作者:Lii,如若转载,请注明出处:http://www.178linux.com/34698

(1)
LiiLii
上一篇 2016-08-13
下一篇 2016-08-13

相关推荐

  • Ansible Conditionals & Loops

     一、条件语句     条件判断语句,就是根据某些变量的值来控制Ansible的执行流程。控制某些主机执行某些操作与不执行某些操作。根据某些操作结果,判断是否执行其它操作等等。     Ansible的条件判断语句只有 when 语句,结合变量使用才能显示出它的价值。when的用…

    Linux干货 2015-11-21
  • N26-第一周博客作业

    第一周博客作业 一、计算机的组成及其功能 计算机的组成可分为硬件、软件两部分。 硬件部分: 按冯.诺伊曼提出的计算机体系,计算机可分为五个部分,分别是:控制器、运算器、存储器、输入设备、输出设备。 CPU:由运算器及控制器组成。 控制器:发出决策指令,协调和指挥计算机各部件的工作。 运算器:对数据进行加工,主要进行算数运行、逻辑运算。 存储器:分为内存储器和…

    2017-02-17
  • http协议简介

        http:Hyper Text Transfer Protocol,超文本传输协议。是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hyp…

    Linux干货 2015-11-18
  • Linux如何快速查找需要执行的命令

    大家知道,对于熟悉命令行的用户来说,命令行操作比图形界面操作高效、简洁,那么Linux是如何快速找到命令的位置呢?今天刚学了这一部分,与大家分享。         Linux将命令分为内部命令和外部命令,这是由于一些命令是常用的,需要常驻内存以减少检索时间,所以集成在shell之…

    2017-07-15
  • 13-高级文件系统管理-Quota,RAID,LVM

    配置配额系统     综述         在内核中执行         以文件系统(磁盘分区)为单位启用         对不同组或者用户的策略不同         根据块或者节…

    2017-03-16
  • MarkdownPad2 简单使用指南

    MarkdownPad2 简单使用指南 一级标题 二级标题 三级标题加代码 四级标题 这里是加粗 这里是正文and English 888 这里有正文嵌入代码这种样式 这里是代码块 这种使用的代码块 还有引用 这种格式 这种格式再加粗 拖下来一点的格式加个代码 斜体 斜体内的加粗 自我改好的样式 注意是这种风格的样式! 附:一个很全的颜色代码网页h…

    2016-11-13

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 10:03

    写的很详细,有理论有实践,find命令是笔试中必考的内容跟,所以需要多多联系,熟练掌握