在Linux系统中查询,功能有很多。但是,find是linux下最棒的命令之一,其查询功能非常强大。接下来,我们便来看看其的强大之处。


  • 首先是find的语法:

  • find [起始目录] 寻找条件 操作



 

  • 以下将详细介绍find的大多数用法:

  • 工作方式:其沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作


  1. 打印文件和目录列表

    wKiom1c9wO3AL-91AAAhkKdERLc830.png


    由此可见,find . -print   #打印文件和目录列表

    当使用-print时,’\n’作为用于分隔文件的定界符。

    -print0指明使用’\0’作为定界符来打印匹配的每一个文件名。此方法对于文件名中含有’\n’非常有效。

但在centos上经实际测试,find直接显示匹配到的文件,不需要加上-print选项。


 2.根据文件名或正则表达式匹配搜索  

   选项-name指定了文件名所必须配皮的字符串.

 

wKiom1c9wb7SZoj1AAAoy6D5mzI100.png

打印以.txt结尾的文件


wKioL1c9wqqxwR2lAAAfm7wv3vU961.png

-iname表示匹配的文件名忽略大小写


  3.条件限制,匹配多个条件中的一个

 

-a:表示且

-o:表示或

-not:表示非

wKiom1c9wmKhSudOAAAhK2c7uh0656.png

   打印当前目录下以.txt或.pdf结尾的文件

wKioL1c9w07D_wvWAAAcZbdtL3c404.png

    打印当前目录下以a开头且以.txt结尾的文件

wKioL1c9w0_gVnLUAAAnovrRY70929.png

  打印当前目录下不以a开头且不以.txt结尾的文件

wKiom1c9wmOyElWlAAAifa_zuC8693.png

  打印当前目录下不以txt结尾的文件 或 以pdf结尾的文件


-path:此参数用于将文件路径作为一个整体进行匹配。

wKioL1c9xLjRc7coAAAc_ZbiCkU468.png

-regex :此参数与-path类似,只不过其是基于正则表达式来匹配文件路径的。

  $find . -regex ".*\( \.py \| \.sh \)$"

  4. 否定参数

 find也可以用“!”作为否定参数,它是怎么做到的呢?

wKioL1c9xSfSRsedAAAmyNFgiTg849.png

   如图,匹配所有不以.txt结尾的文件

 

  

  5.基于目录的深度搜索

 find命令在用时会遍历所有的子目录,我们可以采用一些参数来限制其遍历的深度。

  -maxdepth:最大深度限制,1表示只在当前目录,2表示向下两级。以此类推。

wKiom1c9xLGz6_uuAABNiV8jI8Q590.png

$find . -maxdepth 1 -type f -print     #只列出当前目录下的所有普通文件

$find . -mindepth 2 -type f -print    #列出距当前目录至少两个子目录的所有文件


-mindepth:最小深度限制,与上面用法相似。


6.根据文件类型搜索

linux下的文件类型

文件类型 类型参数

普通文件 f

符号文件 l

目录 d

字符设备 c

块设备 b

套接字 s

Fifo(管道文件) p

wKiom1c9xPrAQZjHAAAkQ0eoLaA219.png

因为此用法大多一致,故在此不再一一列举。


   7.根据文件时间进行搜索

linux文件系统中的每个文件都有三种时间戳:

访问时间(atime——access time):就是上次访问这个文件的时间。

改变时间(ctime——change time):就是文件的inode改变的时间(什么是inode?)当你往一个文件中添加数据或者删除数据的时候,修改文件所有者的时候,链接改变的时候,文件的ctime就会发生改变。

修改时间(mtime——modification time):就是文件的内容上一次发生改变的时候的时间。

-atime,-ctime,-mtime可作为find的时间参数。单位是天,这些值通常还带有+或-:+表示大于,-表示小于。

wKiom1c9xYbifwM8AAA9jOWfgio709.png

由以上图可知,text.txt和其余是当天才创建的。如若读者不甚了解,也可以看其后面的日期,便可明白。

上面的时间都是基于“天”,还有基于“分钟”的。

-amin

-mmin

-cmin

由于用法与上相似,再次就不举例了。

find的另一个漂亮的特性是-newer参数,我们可以指定一个用于比较时间戳的参考文件,然后找出比参考文件更新的所有文件。

wKioL1c9xv6j85UmAAAeCfAUihw820.png


 8.基于文件大小的搜索

 -size:用法与上相似

 $find . -type f -size +2k                  #查找大于2k的文件

 $find . -type f -size 2k                  #查找等于2k的文件

 $find . -type f -size -2k                  #查找小于2k的文件

wKioL1c9x1qwU5R9AABLZ-98QC8011.png

 除了k之外,还有其他文件大小单元

 b——块(512字节)。

 c——字节。

 w——字。

 k——千字节。

 M——兆字节。

 G——吉字节。


    9 .删除匹配的文件

  看到此处,可能你会不解,find明明是个查询命令,怎么来做删除呢?那接下来看看如何实现的

  -delete参数可以实现此功能。

  wKioL1c9x9PTlWD7AAAp9WwhusU875.png


  10.基于文件权限和所有权记性匹配

  -perm:

 wKiom1c9xyaQ9loIAAAq1280jlo680.png

 -user:后可解用户名或uid

   如$find . -type f -user root -print    # 打印root用户所拥有的文件

此处也不再一一列举了,读者可以自己去试试看,便知。


  11.结合find执行命令或动作

  -exec:此参数是find最强大的参数之一。

wKioL1c9yNiw5RLKAAA4QC-So1U021.png

   #将所有c程序拼接起来写入单个文件file.txt中


  12.让find跳过特定的目录

   $find  . \(-name ".git" -prune \) -o \( -type f -print \)



  13.find与xargs结合使用

   xargs:将标准输入转换成命令行参数。

   $find . -type f -name "*.txt" -print0 |xargs  -0 rm -f   #将匹配到的文件删除,xargs   -0   将 \0作为输入定界符。

   $find . -type f -name "*.c" -print0 | xargs  -0wc -l     #统计所有c程序文件的行数


本人总结的大概就这么多,如有补充或不足,请大家多多指出,并修改。俗话说的好开源是一种精神,共享的是一种美德。所以共同进步。