强大的find命令在linux中是用来在指定目录下查找文件的,对于find命令来说任何位于参数之前的字符串都将被视为将要被查找的目录名,而如果使用该命令时,不设置任何参数,则find命令将默认在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。

一、find 命令格式 (即语法)

   1、find命令的一般形式为:

     #   find 查找路径名 -options [-print -exec -ok ...] 

       *查找路径名:指定具体的目标路径,不指定默认为当前目录。

       *options(查找条件):指定的查找标准,可以为文件名、大小、类型、权限等标准,默认为找出指定路径下的文件

       *处理动作:对符合的文件做操作,默认打印输出至屏幕。

例如:请在当前目录下查找以“.txt”结尾的文件,操作如下:

blob.png

在指定了路径"/app"的情况下,find命令就可以把查询到的结果“help.txt”打印到屏幕。

   2、find命令的参数:

     #  pathname: 在find命令所查找的目录路径中,可以用.来表示当前目录,用/来表示系统根目录。

find命令不仅可以用绝对路径进行查找,同时也可以用相对路径进行查找,那么在“/app”下查找以“.txt”结尾的文件,我们也可以用相对路径来做,操作如下:

blob.png

注意:其中“.”代表当前,而不输入路径则默认为当前。

     #  -exec: find命令对匹配的文件执行该参数所给出的shell命令时,相应命令的形式为"command { } \; ",这里要注意"{ }"和“\;”之间的空格。

     #  -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

二、find命令工作特点 

   1、  优点:

     #实时查找

     #精确查找,搜索整个目录下所有文件

     #可以对查询到的文件惊喜指定动作,即查看、删除、移动等等。

   2、缺点:

     #查找速度太慢

三、find命令的使用

我们可以把查询条件想象的分为两类,即选项和测试条件

   1、find命令选项

     #指定目录的查找范围

      *  -mindepth N 最小搜索深度

      * -maxdepth N 最大搜索深

      * -mindepth N -maxdepth N  只搜索指定深度

举例说明一下,我们都知道find命令是默认递归,如果我们不指定深度的话,它会默认把包含查找条件的所有子文件中也列出,比如:

blob.png

我们可以看到在"/app"路径下一、二、三、四、五级都包含“hello”,那如果我们直接查询,"find"就把所有文件都列出,但如果我们只要第三级目录下“hello”文件呢,所以我们需要给"find"指定一个深度,操作如下:

blob.png

这样我们就可以得到第三级“/app/1/2”中的“hello”文件

     #查找空文件

      *  -empty 查询内容为空的文件,这个比较简单直接接到“find”命令后就可以,操作如下:

blob.png

注意:如果不加路径,"find”命令同样会默认为当前目录。

   2、  find命令测试条件

     #根据文件名进行查找

       *  -name "文件名”以文件名进行查找,支持使用glob

       *  -iname "文件名” 按文件名不区分大小写查找,只支持glob风格的查找方式:*,[],[^],?

       *  -regex "文件名”基于正则表达式查找文件,正则部分要用引号引起来,同时要表示文件的完整路径,搜索当前目录时,用./,搜索指定目录时如/app,则用/app/....  ,例如,在当前目录下把所有以“r..t”开头“.sh”结尾的文件列出,操作如下:

blob.png

       *  -inum inode号 以inode号为查找条件

       *  -samefile name 找出与name inode相同的文件

       *  -links n 找到硬链接数为n的文件

     #根据文件从属关系进行查找

       *  -user 用户名:查找属主为指定用户(UID)的文件

       *  -group 组名 :查找属组为指定组(GID)的文件

       *  -uidUserID:查找属主为指定的UID号的文件

       *  -gidGroupID:查找属组为指定的GID号的文件

       *  -nouser:查找没有属主的文件

       *  -nogroup:查找没有属组的文件

具体操作如下:

blob.png

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

       *  f: 普通文件

       * d: 目录文件

       *  l: 符号链接文件

       * s:套接字文件

       * b: 块设备文件

       * c: 字符设备文件

       * p: 管道文件

     #根据文件大小进行查找

       * -size [+|-]#UNIT  常用单位:k, M, G,c(byte)  注释: #UNIT: (#-1, #] ,如6k表示(5k,6k];+#UNIT :(#,∞)  ,如+6k表示(6k,∞);-#UNIT:[0,#-1] ,如-6k 表示[0,5k]。

具体操作如下:

blob.png

     #根据时间进行查找

       * -atime[+|-]time/-amin[+|-]time  以访问时间(天/分钟)查找

       * -mtime[+|-]time/-mmin[+|-]time  以数据修改时间(天/分钟)查找

       * -ctime[+|-]time/-cmin[+|-]time  以元数据修改时间(天/分钟)查找

具体操作如下:

blob.png

     #根据文件权限进行查找

       * -perm  MODE  精确权限匹配

       * -perm /MODE  :任何一类(u,g,o)对象的权限中只要能一位匹配即可,相互之间表示或的关系,"+"等同于“/”,但“+” 从centos7开始淘汰

       * -perm -MODE  :每一类对象都必须同时拥有指定权限,相互之间表示与的关系

     #组合条件测试

       * 内容包含     与:-a    或:-o    非:  -not

       * 德 摩根定律:

             非(A且B)=(非A)或(非B); 非 (A或B)=(非A)且(非B)

   3、 处理动作

     # -print (默认) 查找的结果打印到终端

     # -ls 查找的结果显示详细信息,以长文件的格式输出

     # -delete 将查找的结果删除,不交互

     # -ok shell command {} \;     查找到的文件传递给COMMAND命令,提每步都给用户提示确认操作(交互执行shell命令)

     # -exec shell command {} \;   查找到的文件传递给COMMAND命令,直接修改完成,不给用户确认(非交互执行shell命令)

     # 注意:find将查找到的文件路径一次性传递给后面的命令,但有很多命令不能接受过长的参数,从而将会导致命令执行失败,所以有时我们需要借助xargs命令,来帮助我们进行参数的传递,例如 :

      [root@centos6 ~]# find /etc -type f | xargs -i  {} cp/app/tmp    -i参数是由find命令的结果传给xargs命令的,并且由-i指定结果代替符 {}。

       到这里为止我们已经学习完了关于“find”命令的使用方法,也列出了很多常用的命令选项,如果我们能熟练掌握了它们,那么以后在linux中查找文件也将会是一件很容易的事情。