工作中经常会用到根据文件的类型、名字、权限、访问时间、属主、属组等等属性来查找系统中文件的需求,本文就详细介绍下linux系统中查找文件的命令find的用法;

   首先,介绍下find工具:find是一款实时的查找工具,其通过遍历指定起始路径下的文件系统层级结构来完成文件的查找工作,由于其是实时查找、精确查找,所以它的查找速度略慢;下面就详细介绍下此命令的用法:

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

     其中,查找起始路径表示指定具体的搜索目标的起始路径,默认为当前工作目录,用./表示;

    查找条件表示指定的查找标准,可根据文件名、大小、类型、从属关系等等标准,默认为找出指定路径下的所有文件;

    处理动作表示对符合查找条件的文件做出的动作,例如删除,移动等等操作,默认为输出至标准输出;

  具体的查找条件类型及示例:

   1、根据文件名查找:-name,-iname

    -name根据文件名查找,区分大小写,例如:

    查找/woniu目录下名字为zyc的文件:

     [root@localhost woniu]# ls

       text.txt  zyc  Zyc  zyc123

       [root@localhost woniu]# find /woniu/ -name zyc

       /woniu/zyc

     -iname根据文件名查找,不区分大小写,例如:

    同样查找/woniu目录下名字为zyc的文件: 

       [root@localhost woniu]# ls

       text.txt  zyc  Zyc  zyc123

       [root@localhost woniu]# find /woniu/ -iname zyc

       /woniu/Zyc

       /woniu/zyc

我们看到,以大写Z开头的和以小写z开头的都被查找出来了,这就是-name和-iname的区别;

    同时,根据文件名查找文件还支持glob风格的通配,可以通过匹配元字符*、?等来查找文件;例如:

    查找/woniu目录下以zyc开头的文件:   

     [root@localhost woniu]# ls 

       text.txt  zyc  Zyc  zyc123

       [root@localhost woniu]# find /woniu -name "zyc*"

        /woniu/zyc123

        /woniu/zyc

    注意:此处用的是-name,所以以大写Z开头的没有被查找出来;

     查找/woniu目录下以zyc开头,后面跟一个字符的文件:    

      [root@localhost woniu]# ls 

      text.txt  zyc  Zyc  zyc1  zyc12  zyc123

      [root@localhost woniu]# find /woniu -name "zyc?"

      /woniu/zyc1

    2、根据文件的从属关系来查找文件;-user、-group、-uid、-gid、-nouser、-nogroup

    -user根据文件的属主来查找文件,例如:

    查找/woniu目录下属主为woniu的文件:

     [root@localhost woniu]# ll

     total 4

    -rwxr-xr-x 1 root  root  37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 woniu woniu  0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root  woniu  0 Dec 18 18:16 woniu1

    -rw-r--r-- 1 root  root   0 Dec 18 17:46 zyc

    -rw-r--r-- 1 root  root   0 Dec 18 17:54 Zyc

    -rw-r--r-- 1 root  root   0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 root  root   0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root  root   0 Dec 18 17:46 zyc123

    [root@localhost woniu]# find /woniu -user woniu

    /woniu/woniu

    -group根据文件的属组来查找文件,例如:

    查找/woniu目录下属组为/woniu的文件:   

    [root@localhost woniu]# ll

    total 4

    -rwxr-xr-x 1 root  root  37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 woniu woniu  0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root  woniu  0 Dec 18 18:16 woniu1

    -rw-r--r-- 1 root  root   0 Dec 18 17:46 zyc

    -rw-r--r-- 1 root  root   0 Dec 18 17:54 Zyc

    -rw-r--r-- 1 root  root   0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 root  root   0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root  root   0 Dec 18 17:46 zyc123

    [root@localhost woniu]# find /woniu -group woniu

    /woniu/woniu1

    /woniu/woniu

     -uid查找属主指定UID的所有文件,例如:

    通过id -u zyc可知,zyc用户的uid为4007,查找/woniu目录下uid为4007的文件,其实就是查找属主为zyc的文件;   

    [root@localhost woniu]# id -u zyc

    4007

    [root@localhost woniu]# ll

    total 4

    -rwxr-xr-x 1 root  root  37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 woniu woniu  0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root  woniu  0 Dec 18 18:16 woniu1

    -rw-r--r-- 1 root  root   0 Dec 18 17:46 zyc

    -rw-r--r-- 1 root  root   0 Dec 18 17:54 Zyc

    -rw-r--r-- 1 zyc   zyc    0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 zyc   zyc    0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root  root   0 Dec 18 17:46 zyc123

    [root@localhost woniu]# find /woniu -uid 4007

    /woniu/zyc1

    /woniu/zyc12

    -gid查找属组指定GID的所有文件,例如:

    通过id -g woniu可知,woniu用户的uid为4004,查找/woniu目录下gid为4004的文件,和查找属组为woniu的文件结果一样 ;  

    [root@localhost woniu]# id -g woniu

    4004

    [root@localhost woniu]# ll

    total 4

    -rwxr-xr-x 1 root  root  37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 woniu woniu  0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root  woniu  0 Dec 18 18:16 woniu1

    -rw-r--r-- 1 root  root   0 Dec 18 17:46 zyc

    -rw-r--r-- 1 root  root   0 Dec 18 17:54 Zyc

    -rw-r--r-- 1 zyc   zyc    0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 zyc   zyc    0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root  root   0 Dec 18 17:46 zyc123

    [root@localhost woniu]# find /woniu -group 4004

    /woniu/woniu1

    /woniu/woniu

    -nouser查找没有属主的文件,例如:

    查找/woniu目录下没有属主的文件;由ll命令可知woniu目录下的woniuw文件没有了属主;

    [root@localhost woniu]# ll

    total 4

    -rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 4004 4004  0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root 4004  0 Dec 18 18:16 woniu1

    -rw-r--r-- 1 root root  0 Dec 18 17:46 zyc

    -rw-r--r-- 1 root root  0 Dec 18 17:54 Zyc

    -rw-r--r-- 1 zyc  zyc   0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 zyc  zyc   0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root root  0 Dec 18 17:46 zyc123

    [root@localhost woniu]# find /woniu -nouser

    /woniu/woniu

    -nogroup查找没有属组的文件,例如:

    查找/woniu目录下没有属组的文件;   

    [root@localhost woniu]# ll

    total 4

    -rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 4004 4004  0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root 4004  0 Dec 18 18:16 woniu1

    -rw-r--r-- 1 root root  0 Dec 18 17:46 zyc

    -rw-r--r-- 1 root root  0 Dec 18 17:54 Zyc

    -rw-r--r-- 1 zyc  zyc   0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 zyc  zyc   0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root root  0 Dec 18 17:46 zyc123

    [root@localhost woniu]# find /woniu -nogroup

    /woniu/woniu1

    /woniu/woniu

    3、根据文件类型查找-type,其中文件的类型有:f表示普通文件、d表示目录文件、l表示符号链接文件、b表示块设备文件、c表示字符设备文件、s表示套接字文件、p表示管道文件;例如:

    查找/woniu目录下的普通文件:

    [root@localhost woniu]# ll

    total 4

    -rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 4004 4004  0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root 4004  0 Dec 18 18:16 woniu1

    -rw-r--r-- 1 root root  0 Dec 18 17:46 zyc

    -rw-r--r-- 1 root root  0 Dec 18 17:54 Zyc

    -rw-r--r-- 1 zyc  zyc   0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 zyc  zyc   0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root root  0 Dec 18 17:46 zyc123

    [root@localhost woniu]# find /woniu -type f

    /woniu/zyc123

    /woniu/zyc1

    /woniu/Zyc

    /woniu/woniu1

    /woniu/zyc12

    /woniu/text.txt

    /woniu/woniu

    /woniu/zyc

    查找/woniu目录下的目录文件:   

    [root@localhost woniu]# ll

    total 8

    drwxr-xr-x 2 root root 4096 Dec 18 18:46 linux

    -rwxr-xr-x 1 root root   37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 4004 4004    0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root 4004    0 Dec 18 18:16 woniu1

    -rw-r--r-- 1 root root    0 Dec 18 17:46 zyc

    -rw-r--r-- 1 root root    0 Dec 18 17:54 Zyc

    -rw-r--r-- 1 zyc  zyc     0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 zyc  zyc     0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root root    0 Dec 18 17:46 zyc123

    [root@localhost woniu]# find /woniu -type d

    /woniu

    /woniu/linux

    4、根据文件的大小查找-size,其中-size后面跟数字加单位表示大小,数字前面也可以跟加减号,表示小于或大于,例如

    查找根目录下大小为10M的目录或文件:

   [root@localhost woniu]# find / -size 10M

     查找根目录下小于10M的文件或目录:

    [root@localhost woniu]# find / -size -10M

     查找根目录下大于10M的文件或目录:

   [root@localhost woniu]# find / -size +10M

    5、根据文件的时间戳来查找,文件的时间戳包括以"天"为单位的atime、ctime、mtime和以"分钟"为单位的amin、mmin、cmin,其中atime表示文件的访问时间;ctime表示文件的创建时间;mtime表示文件的修改时间;同理amin、mmin、cmin和atime、ctime、mtime一样,只不过是以分钟为单位;这些也可以像表示文件大小的size一样,前面跟加减号来表示几天前几天后及几分钟前和几分钟后的时间;例如:

    查找根目录下3天前访问过的文件或目录:

    [root@localhost woniu]# find / -atime +3

     查找根目录下3天内修改过的文件或目录:

    [root@localhost woniu]# find / -mtime -3

     查找根目录下3天内修改过的文件或目录:

    6、根据权限来查找文件:-perm [/|-] mode,其中mode表示精确匹配权限;/mode表示任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即足;-mode表示每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;例如:

    查找/woniu目录下权限为644的文件:

[root@localhost woniu]# find /woniu -type f -perm 644 -ls

786484    0 -rw-r--r--   1 root     root            0 Dec 18 17:46 /woniu/zyc123

786439    0 -rw-r--r--   1 zyc      zyc             0 Dec 18 18:09 /woniu/zyc1

786438    0 -rw-r--r--   1 root     root            0 Dec 18 17:54 /woniu/Zyc

786488    0 -rw-r--r--   1 root     4004            0 Dec 18 18:16 /woniu/woniu1

786486    0 -rw-r--r--   1 zyc      zyc             0 Dec 18 18:09 /woniu/zyc12

786487    0 -rw-r--r--   1 4004     4004            0 Dec 18 18:16 /woniu/woniu

786458    0 -rw-r--r--   1 root     root            0 Dec 18 17:46 /woniu/zyc

    查找/woniu目录下任意一类用户有写权限的文件:

[root@localhost woniu]# find /woniu -type f -perm /222 -ls

786484    0 -rw-r--r--   1 root     root            0 Dec 18 17:46 /woniu/zyc123

786439    0 -rw-r--r--   1 zyc      zyc             0 Dec 18 18:09 /woniu/zyc1

786438    0 -rw-r--r--   1 root     root            0 Dec 18 17:54 /woniu/Zyc

786488    0 -rw-r--r--   1 root     4004            0 Dec 18 18:16 /woniu/woniu1

786486    0 -rw-r--r--   1 zyc      zyc             0 Dec 18 18:09 /woniu/zyc12

786485    4 -rwxr-xr-x   1 root     root           37 Dec 12 20:00/woniu/text.txt

786487    0 -rw-r--r--   1 4004     4004            0 Dec 18 18:16 /woniu/woniu

786458    0 -rw-r--r--   1 root     root            

   查找/woniu目录下所有用户都有写权限的文件:   

[root@localhost woniu]# find /woniu -type f -perm -222 -ls

786439    0 -rw-rw-rw-   1 zyc      zyc             0 Dec 18 18:09 /woniu/zyc1

786458    0 -rw-rw-rw-   1 root     root            0 Dec 18 17:46 /woniu/zyc


  以上的条件也可以组合起来进行匹配查找,组合匹配的关系有-a:表示与关系,前后条件都满足即满足;-o:表示或关系,前后条件只要一个满足即满足;-not:表示非关系,用来查找与匹配条件相反的操作,也可以用!代替;比如:


   查找/var目录下属主为root,且属组为mail的所有文件或目录

      find /var/ -user root -a -groupmail

   查找/usr目录下不属于root,bin或hadoop的所有文件或目录;用两种方法;

     (1)、find /usr/ -not -user root -a -not -user bin -a -not-user hadoop

      (2)、find /usr/ -not \( -user root -o -user bin -o -userhadoop \) #注意:括号内前后有空格

   查找/etc目录下最近一周其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;

     (1)、find /etc/ -mtime -7 -a -not -user root -a -not -userhadoop

      (2)、find /etc/ -mtime -7 -not \( -user root -o -user hadoop\)

  查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录

      find / \( -nouser -o -nogroup\) -atime -7

   查找/etc目录下大于1M且类型为普通文件的所有文件;

      find /etc/ -size +1M -type f

   查找/etc目录下所有用户都没有写权限的文件;(所有用户都没有表示任意一类用户都没有)

      find /etc/ -not -perm /222-type f

   查找/etc目录下至少有一类用户没有执行权限的文件;(至少有一类没有表示不是所有用户都有)

      find /etc/ -not -perm -111-type f

   查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件;

      find /etc/init.d/ -perm -111-perm -002 -type f


介绍完了查找条件接下来介绍下处理动作,包括:   

   -print:输出至标准输出;默认的动作;                     -ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息     -delete:删除查找到的文件                             -fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;                                           -ok COMMAND {} \; :对查找到的每个文件执行COMMAND命令;对于执行结果需要用户确认                                       -exec COMMAND {} \; :对查找到的每个文件执行COMMAND命令;不需要用户确认;注意:find传递查找到的文件至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;但是有些命令不能接受过长的参数,此时命令执行会失败,另外一种方式可规避此问题:find xargsCOMMAND

比如:

  查找/woniu目录下文件名是zyc的文件并删除:

    [root@localhost woniu]# ll

    total 8

    drwxr-xr-x 2 root root 4096 Dec 18 18:46 linux

    -rwxr-xr-x 1 root root   37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 4004 4004    0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root 4004    0 Dec 18 18:16 woniu1

    -rw-rw-rw- 1 root root    0 Dec 18 17:46 zyc

    -rw-r--r-- 1 root root    0 Dec 18 17:54 Zyc

    -rw-rw-rw- 1 zyc  zyc     0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 zyc  zyc     0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root root    0 Dec 18 17:46 zyc123

    [root@localhost woniu]# find /woniu -name zyc -exec rm -f {} \;

    [root@localhost woniu]# ll

    total 8

    drwxr-xr-x 2 root root 4096 Dec 18 18:46 linux

    -rwxr-xr-x 1 root root   37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 4004 4004    0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root 4004    0 Dec 18 18:16 woniu1

    -rw-r--r-- 1 root root    0 Dec 18 17:54 Zyc

    -rw-rw-rw- 1 zyc  zyc     0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 zyc  zyc     0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root root    0 Dec 18 17:46 zyc123

   以上命令结果等同于:    

    [root@localhost woniu]# ll

    total 8

    drwxr-xr-x 2 root root 4096 Dec 18 18:46 linux

    -rwxr-xr-x 1 root root   37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 4004 4004    0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root 4004    0 Dec 18 18:16 woniu1

    -rw-r--r-- 1 root root    0 Dec 18 19:52 zyc

    -rw-r--r-- 1 root root    0 Dec 18 17:54 Zyc

    -rw-rw-rw- 1 zyc  zyc     0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 zyc  zyc     0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root root    0 Dec 18 17:46 zyc123

    [root@localhost woniu]# find /woniu -name zyc | xargs rm -f

    

    [root@localhost woniu]# ll

    total 8

    drwxr-xr-x 2 root root 4096 Dec 18 18:46 linux

    -rwxr-xr-x 1 root root   37 Dec 12 20:00 text.txt

    -rw-r--r-- 1 4004 4004    0 Dec 18 18:16 woniu

    -rw-r--r-- 1 root 4004    0 Dec 18 18:16 woniu1

    -rw-r--r-- 1 root root    0 Dec 18 17:54 Zyc

    -rw-rw-rw- 1 zyc  zyc     0 Dec 18 18:09 zyc1

    -rw-r--r-- 1 zyc  zyc     0 Dec 18 18:09 zyc12

    -rw-r--r-- 1 root root    0 Dec 18 17:46 zyc123