find命令是一种精确查找工具,可以查找精确查找文件的位置,单相对于locate命令的模糊查找来说,速度要慢了许多。


 find - search for files in a directory hierarchy

 find [path...] [expression]

  path:是指文件的路径,比如/var,/etc,/tmp等工作目录;

  expression:

   选项:比如-user,-root,-size,-perm

   条件:本次查找的标准,可以是文件名,可以是文件大小,可以是文件的权限信息,可以是时间戳等等。

   处理动作:默认是-print输出,可以是-ls 显示文件的具体属性信息,也可以是进行某种操作;


expression:

 根据文件名查找:

  -name pattern:根据文件名查找,支持使用、Globbing字符查找(*,[^],[],?)等

  -iname pattern:忽略文件名的大小写进行查找

  -samefile pattern:根据指定的文件名,查找其他硬链接的文件的路径;

linux精确查找——find命令_find

 

根据文件的inode号查找:

 -inum n:

 -links n:查找硬连接数为"n"的文件;

 -regex pattern:

 -iregex pattern:

 linux精确查找——find命令_find_02

根据文件所有权进行查找:

 -user uname:

 -uid UID:就是根据用户名和/或用户ID,查找属主为这个用户账户的所有文件;

 -group gname:

 -gid GID:就是根据组名和/或组ID,查找属组为这个组账户的所有文件;

 -nogroup:在文件的所有权的权限位上,没有属组名称仅显示属组ID的文件;

 -nouser:在文件的所有权的权限位上,没有属主名称仅显示属主ID的文件;

linux精确查找——find命令_命令_03

根据文件的类型:

 -type c:

  c表示文件类型的单字符描述符,其中包括:

    b:块设备

    c:字符设备

    d:目录

    f:普通文件

    l:符号链接

    p:管道

    s:套接字

  -xtype

    符号连接文件的查找结果需要其他选择的配合才能找到,否则查找的是被链接的原文件;

linux精确查找——find命令_find_04

根据时间戳进行查找:

 以天为时间单位进行查找:

   -atime [+|-]n:根据访问时间戳进行查找

   -ctime [+|-]n:根据改变时间戳进行查找

   -mtime [+|-]n:根据修改时间戳进行查找

      n:[n,n+1)

    +n:[n+1,+oo)

    -n:[now,n)

    用简单的语言来说,就是下图的结果。

linux精确查找——find命令_find_05

 以分钟为单位进行查找:

  amin [+|-]n: 

  cmin [+|-]n: 

  mmin [+|-]n: 


 根据文件的大小进行查找:

  -size n[cwbkMG]

   n:(n-1,n]

   +n:[n,+oo)

   -n:[0,n-1]


 逻辑运算操作符组合前面的条件进行复杂逻辑的判断:

  -a | -and:逻辑与运算,默认就是该逻辑运算,可省略;

  -o | -or:逻辑或运算;

  -not | !:逻辑非运算;


  德默根定律依然生效;A&B=!A|!B

  根据权限来查找:

   -perm [/|-]mode:

    mode:精确权限匹配,意思是查找必须与指定的权限位完全匹配的文件;

    /mode:任何一个权限位的权限中只要有一个去权限能够满足条件,即为匹配成功,就可以将之作为查找结果;隐含的逻辑或关系;

    -mode:每一个权限位的权限中都必须同时包含指定的权限位,才能满足条件,才算匹配成功,将之作为查找结果;隐含了逻辑与关系;


 真 取反 假

 假 取反 真

 全部为真 取反 任何一个为假

 全部为假 取反 任何一个为真

  处理动作:

    -print:将符合条件的查找结果直接输出到标准输出;默认动作;

-ls:将符合条件的查找结果以"ls -dils"命令的执行结果进行显示;

-exec command {} \;

-ok command {} \;

  对于符合条件的查找结果按照"command"命令再执行一遍,{}为占位符,其含义是:用来引用find命令查找结果中的各个文件的路径信息;


ex:

 查找当前系统上没有属主或属组,且最近一个月内曾被访问过的文件,并将其属主属组均修改为root;

~]# find  -nouser -o -nogroup  -a -atime 30 -exec chown root,root {} \ 


注意:

-exec是非交互式的;-ok是交互式的;

很多命令是不能放置于管道后面使用的;因为管道输送的是纯字符串信息,因此管道后面的命令一般来讲都必须是处理字符串的命令;通常,可以使用xarge命令将其转换成能够被管道后面的命令处理的参数;

linux精确查找——find命令_命令_06