我们从一个文件中查找我们需要的字符可以用grep,那么当我们要在某个目录下查找我们需要的文件时候怎么找呢,这时候就要用到了find命令。

  •    find命令不像wheris一样通过在其建立的数据库中检索数据,而是实时的查找。可以找到上一秒才经过改变的文件。当然这样就造成了一个缺点,就是查找速度比较慢。

  • find用法

          find [选项] [查找路径] [查找条件] [处理动作]


               查找路径是我们给定的路径,默认的路径为是在当前目录下查找

               

               查找条件默认是所有文件

               

               处理动作默认是显示

               

               因此我们只用一个find,后边不跟任何参数的时候就会递归显示当前目录下的所以文件。



  • 路径

      路径可以跟想对路径,也可以用绝对路径

  • 查找条件

    • find -name 文件名

      find -iname :查找时候不区分大小写

       文件名支持使用 * ? [] [^] 这样的通配符

      [root@station57 etc]# find -name fs*
      ./fstab


    • find -size 大小

        可以根据文件大小查找

        find -size [+|-] 数字

              单位可以是,K,M,G

        例如

     1、我们要查找/etc下大于2M的文件

[root@station57 etc]# find /etc -size +3M
/etc/selinux/targeted/modules/active/policy.kern
/etc/selinux/targeted/policy/policy.24

    2、查找/etc下小于1M的文件  

[root@station57 etc]# find /etc -size -1M
/etc/cups/printers.conf
/etc/cups/classes.conf
/etc/cups/client.conf
...
  • find -user usernae:以文件所属用户名查找

      查找tmp下文件属主是xuqimin的文件

    [root@station57 tmp]# ll
    total 9532
    -rw-r--r-- 1 root    root    4873884 Feb 26 20:12 etc-2014-02-26
    -rw-r--r-- 1 root    root    4873884 Feb 26 20:13 etc-2014-02-26-20-13-28
    -rw-rw-r-- 1 xuqimin xuqimin       0 Feb 28 14:14 hello
    -rw-r--r-- 1 root    root       2657 Feb 28 01:25 ip.txt
    drwxrwsr-t 2 root    cloud      4096 Feb 24 23:34 test
    drwxr-xr-x 3 root    root       4096 Feb 28 11:14 xuxu
    [root@station57 tmp]# find /tmp -user xuqimin
    /tmp/hello


  • find -group groupname:以文件所属组名查找

     查找/tmp下文件属组是cloud的文件

    [root@station57 tmp]# ll
    total 9532
    -rw-r--r-- 1 root    root    4873884 Feb 26 20:12 etc-2014-02-26
    -rw-r--r-- 1 root    root    4873884 Feb 26 20:13 etc-2014-02-26-20-13-28
    -rw-rw-r-- 1 xuqimin xuqimin       0 Feb 28 14:14 hello
    -rw-r--r-- 1 root    root       2657 Feb 28 01:25 ip.txt
    drwxrwsr-t 2 root    cloud      4096 Feb 24 23:34 test
    drwxr-xr-x 3 root    root       4096 Feb 28 11:14 xuxu
    [root@station57 tmp]# find /tmp -group cloud
    /tmp/test
    /tmp/test/qwe
    /tmp/test/99


  • find -uid 用户uid:以文件用户uid查找

  • find -gid  用户gid:以文件用户gid查找

  • find -type:文件类型查找

        按文件类型查找可以支持很多类型,可以根据是否是普通文件或者目录文件,块文件查找,下面列出可以跟的文件类型

        find -type

                 

    f: 查找普通文件

    d: 查找目录

    b: 查找块设备

    c: 查找字符设备

    l: 查找符号链接文件

    p: 查找命名管道

    s: 查找套接字

        例如我们要查找/dev下的套接字文件

    [root@station57 etc]# find /dev/ -type s
    /dev/log
  • 当我们要查找某个时候段内修改过或者访问过的文件的时候就用到了“-time”这个参数了

    这个选项可以跟多个参数,可以根据访问时间(-atime )查找,(-mtime)修改时间,(-ctime)改变时间,来查询,也可是使用-amin -mmin -cmin

    例如,我们要查找root家目录里2天之内修改过的文件

    [root@station57 etc]# find /root/scriptExpand/ -mtime -3
    /root/scriptExpand/
    /root/scriptExpand/nice.sh
    /root/scriptExpand/func.sh
    /root/scriptExpand/caseBackup.sh


  • 当然find也可以根据文件权限来查找

       find -perm [+|-]MODE

       mode前面的加减号可以不使用,不使用的时候代表精确查找每一位权限都匹配的文件

       find -perm +mode :意思是三类用户中任何一位用户的任意一位匹配都行。常用于查找某类用户的某特定权限是否存在

       find -perm -mode:意思是每类用户每个需要检查的位都匹配

          例如,查找/etc/目录下至少有一类用户没有写权限;

                # find /etc/ -not -perm -222

  • 单单依靠前面几个参数单独使用似乎也不是那么符合我们对文件的查找需求,那我们能不能查找/etc目录下及大于2M,又属于root的文件呢。当然可以了,那就要使用find的组合条件了。find支持与、或、非。这些逻辑运算,当然也支持多个逻辑运算组合使用,不过我们使用的时候要注意运算符的优先级问

      例如我们要查找/usr目录下不属于root、bin或hadoop的所用文件;

    [root@station57 etc]# find /usr/ -not -user root -a -not -user bin -a -not -user hadoop
    /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
    /usr/local/apache2/icons/forward.gif
    /usr/local/apache2/icons/pie2.gif
    /usr/local/apache2/icons/folder.gif
    /usr/local/apache2/icons/sphere1.gif
    /usr/local/apache2/icons/pie8.png
    /usr/local/apache2/icons/apache_pb.gif
    /usr/local/apache2/icons/pdf.gif
    /usr/local/apache2/icons/small
    /usr/local/apache2/icons/small/forward.gif
    /usr/local/apache2/icons/small/p_w_picpath.gif

      查找/tmp下1天之内访问过,切属主是xuqimin的文件

    [root@station57 tmp]# ll
    total 9532
    -rw-r--r-- 1 root    root    4873884 Feb 26 20:12 etc-2014-02-26
    -rw-r--r-- 1 root    root    4873884 Feb 26 20:13 etc-2014-02-26-20-13-28
    -rw-rw-r-- 1 xuqimin xuqimin       0 Feb 28 14:14 hello
    -rw-r--r-- 1 root    root       2657 Feb 28 01:25 ip.txt
    drwxrwsr-t 2 root    cloud      4096 Feb 24 23:34 test
    drwxr-xr-x 3 root    root       4096 Feb 28 11:14 xuxu
    [root@station57 tmp]# find /tmp -atime -1 -a -user xuqimin
    /tmp/hello


    • 仅仅是查找文件却不能对文件操作似乎也不能解决我们的根本问题,不要着急,find还有一个处理动作的选项

        处理动作

         

      -print: 显示

      -ls: 显示查找到的文件的详细信息;

      -exec COMMAND \;

             find /tmp -atime +30 -exec mv {} {}.old \;

      -ok COMMAND \;

  1. 默认处理动作是讲找到的文件显示出来,我们也可以在命令最后加一个ls选项讲找到的文件的详细信息显示出来

    [root@station57 tmp]# find /tmp -atime -1 -a -user xuqimin
    /tmp/hello
    [root@station57 tmp]# find /tmp -atime -1 -a -user xuqimin -ls
        27    0 -rw-rw-r--   1 xuqimin  xuqimin         0 Feb 28 14:14 /tmp/hello
    [root@station57 tmp]#


  2. -exec  ;假如需要将find找到的文件名字后边加一后缀“*.sh”,此时-exec就是一个不错的选择了,以上一题为例,我们讲找到的属主为xuqimin的文件改名为xuqimin.sh

    wKiom1MRwfGRO2b5AAMWm4ZJOYY343.jpg