之前,我们学习过grep来过滤文件内容,而这种查找找的是某一个文件内的内容;以及 less 或者 man 或者上一节提到的 vim 编辑器中的 / 与 ? 都是用来查找单个文件内的内容。而这一节,我们提到的内容为查找符合条件的文件;

  查找依据则大体离不开 ls -l 长整形里面的相关内容;

文件查找  

  我们先回顾下Linux下,通过 ls -l 查看文件的相关属性:文件类型“d”,表示目录文件,文件权限“rwxr-xr-x.”属主、属组、其他用户的权限,“2”表示软连接数,root属主,root属组,4096size大小(通过-h可以转换为有单位的大小值),Jan 30 18:28为change time(通过stat命令可以查看atime/mtime/ctime,通过touch加参数可以修改这三个时间),最后一个即文件名;

locate

  非实时,模糊查找。可以通过“yum install mlocate”安装locate查找工具;

  locate查找是先要建立一个数据库,让后再从数据库里面来查找对应的类容,我们可以通过 updatedb 命令来生成这个数据库;但是在最开始使用的时候,数据库生成会比较慢;

  locate的优势是查找文件比较快速;但是该命令使用较少;

*find

  接下来我们重点介绍find命令;

  相对于locate而言,find实现的是实时查找,精确查找,因为他会遍历查找时所指定的所有文件内容,缺点是相对于locate而言,速度较慢;

  用法:

    find 查找路径 查找标准 查找后执行的处理动作

    查找路径:如果不写,即默认为当前目录

    查找标准:默认为指定路径下的所有文件

    处理动作:默认为显示到屏幕上

  

查找标准:

  常见参数

    -name 'FILENAME' 对文件名做精确匹配

      例如:find /etc/ -name 'passwd'

      其中'FILENAME'还支持文件名通配符,* ? []

      例如:find /etc/ -name '*passwd'

    -iname 'FILENAME' 对文件做精确查找,但是不区分文件名的大小写

    -regex PATTERN  使用正则表达式来进行文件查找

    -user USERNAME  基于文件的属主来查找文件

      例如:find /tmp -user hadoop

    -group GROUPNAME  基于文件的属组来查找文件

      例如:find /tmp -group hadoop

    -uid UID  基于文件的UID来查找文件

    -gid GID  基于文件的GID来查找文件

    【这里需要注意的是,如果用户以及用户组一旦被删除掉,这个用户的属主和属组就没有了,就只能通过uid以及gid来进行查找】

    -nouser  查找没有属主的文件【一般需要定期删除掉没有属主的文件,或者,将这些文件归到root用户下来,保证系统的安全性】

    -nogroup  查找没有属组的文件

      例如:find /tmp -nogroup

      例如:find /tmp -nouser

    -type  根据文件类型进行查找

      f  表示普通文件

      d  表示目录文件

      c  表示字符文件

      b  表示块文件

      l  表示连接文件

      p  表示管道文件

      s  表示套接字文件

      例如:find /etc -type l

    -size  根据文件的大小来查找【这里要注意的是,大小并不是严格的大小,例如10M,可能找出来的文件是9M到11M之间大小的文件都会被过滤】

      数字k

      数字M

      数字G

      [+|-]数字k  #这个表示查找大于,或者小于多少的文件

      如果不加单位,默认查找的大小就是字节;

      例如:find /etc -size +100k

  条件组合

    以上条件都可以根据 与 或 非的逻辑关系进行管理,同时使用多个条件来进行查找;

    -a  与,同时满足多个条件时才能被赛选出来【默认多个条件之间就是“与”关系】

    -o  或,多个条件中只需要满足一个条件即可被赛选出来

    -not  非,不满足条件的文件才会被选出来

      例如:find /tmp -nouser -a -type d

           find /tmp -nouser -o -type d -ls

         find /tmp -not -type d

           find /tmp/test -not -user user1 -a -not -user user2

           find /tmp/test -not \(-user user1 -o -user user2 \)

           find /tmp -not -user user1 -o -not type d

           find /tmp -not \(-user user1 -a type d \)

  时间戳查找

    -mtime  修改时间(一般是只的文件内容变更过的时间)

    -atime  访问时间(被查看过的时间,没有修改任何内容)

    -ctime  属性修改时间(比如属主、属组或者权限等内容改变的时间)

      [+|-]数字  通过正负号来指定时间是几天内,还是几天外,正号表示几天外,而负号则表示几天内,如果没有正负号,则表示访问当天;

      例如:find /tmp -mtime +5

    上面的三个参数,都是以天来计算单位的,如果想要以分钟为单位来进行查找,则使用下面的三个option:

    -mmin  修改时间(分钟)

    -cmin  属性改变时间(分钟)

    -amin  访问时间(分钟)

      [+|-]数字  同样可以使用正负号来表示范围

      例如:find /tmp -amin -5  #五分钟内访问过的文件

           find /tmp -cmin +10  #十分钟前属性改变过的文件

    【这里注意下/tmp目录,在该目录下30天没有访问的文件,会自动被系统删除掉】

  根据权限来查找文件

    -perm MODE  根据文件的权限来查找文件,这是精确查找

      例如:find /tmp -perm 644

    -perm -MODE  查找包含条件的文件

      例如:find /tmp -perm -644  #即查找文件权限小于644的文件,均满足条件,例如文件权限如果是500权限,500被644包含,所以满足条件

    -perm /MODE  九位权限只要有一位满足即可
      例如:find /tmp /640  #在这九位权限中,只要有一位匹配到即可,例如640是rw-r-----,有一个文件权限为 --- r-- --- 其中属组的r权限匹配成功,此文件就满足条件

处理动作

  一般在文件查找出来以后,我们需要对文件进行处理,常见的处理参数如下:

    -print  显示查找文件内容

    -ls  类似于ls -l的形式显示每一个文件的详细信息

    -ok COMMAND {} \;  -ok指定处理命令,{}表示调用前面查找出来的内容,必须以 \; 结尾,则是格式要求

      例如:find /tmp -nouser -ok rm -rf {} \;

    -exec COMMAND {} \;  -exec后面的操作是不需要进行确认的,如果使用-ok,在使用命令的时候回需要进行确认;

      例如:find /tmp -perm -006 -exec chmod o-w {} \;  #查找只有其他用户拥有的读写权限,然后去掉这个文件的度权限,这个用法比较常用;

               find /tmp -type d -ok chmod +x {} \;  

          find /tmp -perm -020 -exec mv {} {}.new \;

          find /tmp -name "*.sh" -a perm /111 -exec chmod o-x {} \;  #查找出以.sh结尾的文件,且具有执行权限的文件,让后将他们的执行权限全部去掉;

    

    find命令再查找到文件后,除了可以使用-ok和-exec关联行为命令外,还可以使用 xargs结合管道符来时用;xargs build and execute command lines from standard input 从标准输入接收命令;

      例如:find /etc -size +1M -exec echo {} >> /tmp/etc.largefiles \;

           find /etc -size +1M | xargs echo >> /tmp/etc.largefiles

        【使用xargs功能就不用再通过{}来调用选出来的内容了;】

练习

1、查找/var目录下属主为root并且属组为mail的所有文件;
  find /var -user root -a -group mail
2、查找/usr目录下不属于root、bin、student的文件;
  find /usr -not -user root -a -not -user bin -o -a -not -user student
  find /usr -not \( -user root -o -user bin -o -user student \)
3、查找/etc目录下最近一周内内容修改过且不属于root以及student用户的文件;
  find /etc -mtime -7 -a -not -user root -a -not -user student
  find /etc -mtime -7 -a -not \( -user root -o -user student \)
4、查找当前系统上没有属主或属组且最近1天内没有被访问过的文件,并将其属主属组均修改为root;
  find / -nouser -o -nogroup -a -atime 1 -exec chowr root:root {} \;
5、查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中
  find /etc -size +1M >> /tmp/etc.largfiles
6、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
  find /etc -not -perm /222 -ls

 

 

  

12 文件查找--find命令的更多相关文章

  1. Linux下的文件查找类命令(转载)

    如何快速有效的定位文件系统内所需要查找的文件呢?Linux为我们提供了一些文件查找类的命令,我们需要掌握以下几个命令: http://blog.csdn.net/sailor201211/articl ...

  2. linux文件查找find命令

    linux文件查找find命令 1.文件查找 基本介绍 在文件系统上查找符合条件的文件 linux上常见的文件查找工具:find命令 查找分类 实时查找 精确查找 基本语法 find  [option ...

  3. linux 文件查找 find命令详解

    一,从索引库查找文件:locate 索引库:操作系统会周期性的遍历根文件系统,然后生成索引库 手动更新索引库:updatedb 语法:locate [OPTION]... PATTERN... 只匹配 ...

  4. linux文件查找-find命令

    find命令:用于在文件树中查找文件,并作出相应的处理 1.find命令的格式: find pathname -options [-print -exec -ok ...] {}\ 2.find命令的 ...

  5. Linux中3个文件查找相关命令详解

    源于:https://mp.weixin.qq.com/s/VPs-IXY6RoxbltHIxtIbng which命令 我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令 ...

  6. 文件查找find命令

    find命令总结: 常用选项: -name 查找/etc目录下以conf结尾的文件 find /etc -name '*conf' -iname 查找当前目录下文件名为aa的文件,不区分大小写 fin ...

  7. 13.Linux文件查找-find命令

    find 命令的基本语法如下: 命令 路径 选项 表达式 动作 find [path...] [options] [expression] [action] 查找 地区 妹纸 18-25岁 约? (1 ...

  8. linux下find(文件查找)命令的用法总结

    关联文章:http://blog.chinaunix.net/uid-24648486-id-2998767.html

  9. 第1章 Linux文件类基础命令

    1. 关于路径和通配符 Linux中分绝对路径和相对路径,绝对路径一定是从/开始写的,相对路径不从根开始写,还可能使用路径符号. 路径展开符号: . :(一个点)表示当前目录 .. :(两个点)表示上 ...

随机推荐

  1. ML(附录3)——过拟合与欠拟合

    过拟合与欠拟合 我们希望机器学习得到好的模型,该模型能够从训练样本中找到一个能够适应潜在样本的普遍规律.然而,如果机器学习学的“太好”了,以至把样本的自身特点当作潜在样本的一般特性,这就使得模型的泛化 ...

  2. 关于meshgrid和numpy.c_以及numpy.r_

    meshgrid的目的是生成两套行列数一致的矩阵,其中一个是行重复,一个是列复制:可以这么来理解,通过ravel()将矩阵数据拉平之后,就可以将这两套矩阵累加在一起,形成一个两行数据,要达到这个效果是 ...

  3. C# 委托、lambda表达式和事件

    什么是委托?委托就是持有一个或多个方法的对象,并且该对象可以执行,可以传递. using System; using System.Collections.Generic; using System. ...

  4. cmp命令详解

    Linux cmp命令 Linux cmp命令用于比较两个文件是否有差异.主要用来比较两个二进制文件 当相互比较的两个文件完全一样时,则该指令不会显示任何信息.若发现有所差异,预设会标示出第一个不同之 ...

  5. ML: 聚类算法-概论

    聚类分析是一种重要的人类行为,早在孩提时代,一个人就通过不断改进下意识中的聚类模式来学会如何区分猫狗.动物植物.目前在许多领域都得到了广泛的研究和成功的应用,如用于模式识别.数据分析.图像处理.市场研 ...

  6. 【java】进制转换

    进制的表现形式: 十进制:0-9 ,满10 进1 八进制:0-7,满8进1,用0开头表示 十六进制:0-9,A-F,满16进1,用0x开头表示 十进制转换二进制: 原理:对十进制数进行除2运算,如37 ...

  7. 怎样在Qsys系统中添加第三方IP核

    1.新建Quartus II工程 2.新建Qsys系统 3.如果没有我们需要添加的IP,需要自己额外添加 4在我们新建的Quartus工程里面新建一个文件夹,命名为ip; 5.将我们已经下载好的IP文 ...

  8. Weka训练模型的存取

    因为WEKA中所有分类器都实现了Serializable,所以只需要用java的ObjectOutputStream就可以实现了. /** * 存储model * * @param model * 训 ...

  9. python打包为独立可执行程序

    linux下 pip install pyinstaller 针对需要的项目 pyinstaller -F -w ./xxx.py 即可

  10. ToString()、Convert.ToString()、(string)、as string 的区别

    通常 object 到 string 有四种方式(假设有object obj):obj.ToString().Convert.ToString().(string)obj.obj as string. ...