写在前面

  在面试时被问到了有关find命令的问题,由于时间长了有一些遗忘,今天重新的复习一下。

一、find语法结构及解释

   语法:

    find   [查找路径]    [查找条件]      [找到后的处理动作]

  查找路径:

    具体要在哪里找,例如/ ,/tmp目录,默认为本目录下,可以不写,或者使用'.'来代替本目录。

  查找条件:

    查找的标准,可以是文件名、权限、日期等条件

  处理动作:

    找到制定文件后后续要作何操作,默认为打印输出,不写或-print均为打印输出。

 

二、查找条件

接下来介绍一些常用到的查找条件

  1、按照文件名查找

     -name "文件名" ,例如:-name '*.txt"    查找所有txt结尾的文件,区分大小写

     -iname "文件名", 例如:-inane “*.Txt”   查找所有txt结尾的文件,不区分大小写。

  2、按照文件类型查找

    -type  "TYPE"

      TYPE可以为

        f : 普通文件

        d: 目录文件

         l: 链接文件

         s:  套接字文件

         b:块文件

  3、按照文件内容修改日期查找:

    以天为单位: -mtime  +# ; 例如:-mtime +7  表示7天前修改的文件

    以分钟为单位: -mmin  +#  ;例如:-mmin +10   表示10分钟前修改的文件

  4、按照属主属组查找:

      -user USERNAME : 查找属主为指定用户的文件。

              -group GROUPNAME:  查找属组为指定用户的文件。

              -uid  UserID:查找指定属主uid号的文件

              -gid GroupID:查找指定属组uid号的文件

  5、按照权限查找:

     -perm  MODE 例如:-perm 644 :按照644权限精确匹配查找文件。

    在权限面前还可以加+-号来模糊匹配,但有些麻烦,且用的不多,在此暂不做考虑。

 

  以上就是最常用的查找条件,当然这些条件在同一类型下也可以同时的出现多个,进行逻辑上的与或非的组合查找。

  当多个查找类型的条件同时出现时,默认为与,例如-type f -name '1.txt' -perm 644,则要查找权限为644,且文件名为1.txt的普通文件。 

  逻辑符号的表示

     与:-a  或:-o  非:!、-not

    例1:

       查找本目录下以txt或csv结尾的普通文件

find . \( -name "*.txt" -o -name "*.csv" \) -print

 

    例2:

       查找本目录下没有属组也没有属主的普通文件

find   .   \( -nouser -a -nogroup  \)  -print

 

    例3:

       查找本目录下文件名不是以txt结尾的普通文件   

find . ! -name "*.txt" -print

    

    附加逻辑技巧: 

!A -a  !B  等价于  ! (A -o  B)
          !A -o  !B  等价于  ! (A -a  B)

 

三、后续动作

  查找完成后,需要有后续动作,因此下面来讨论“处理动作”

 

-print

(默认)打印到屏幕上,可以不写

-ls

相当于将找到的结果做“ls -l "操作

-delete

删除找到的文件

-exec COMMAND {} \;

将找到的文件用shell命令进行处理。

例如:-exec mv {} {}_new \;    将查找到的文件的文件名后面加上"_new" ,此处{}代表的是找到的所有全体内容。

 

  注意:

      find命令会将找到的内容一次性的传递给后续的动作,而不是一个一个的传递。因此有一些shell命令不能一下子接受过多的参数而导致其失效。用下面方式可以避免此类情况的发生。

find   | xargs  COMMAND

 

    

四、简单练习

  1、查找当前目录内文件以txt或dbf文件结尾的普通文件    

find .   -name "*.txt" -a -name "*.dbf"

 

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

find  /var -user root -a -group mail

 

  3、查找/usr目录下属主不属于root、bin、hadoop的所有文件或目录

find /usr   ! -user root -a ! -user bin -a  ! -user hadoop

 

  4、查找/etc目录下最近一周内内容没有被修改过,同时属主不为root,也不是hadoop的文件,删除这些文件    

find /etc -mtime +7 -a  -not \( -user root -o user hadoop\) -delete