码迷,mamicode.com
首页 > 其他好文 > 详细

find命令详解

时间:2016-07-09 22:21:05      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:linux   用户   find   资源   

    linux中find命令是一种强大的实时查找工具,它通过用户给出的路径,在该路径下的文件系统中进行文件查找。因此在遍历一个较大的文件系统时会比较花费时间,而且find命令占用资源也是比较大的,所以它的工作特点是,查找的速度略慢,但是可以实现精确查找和实时查找。由于find命令能力很强大所以它的选项也有很多。

    find命令格式:

        find 【选项】 【查找起始路径】 【查找条件】 【处理动作】

        find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]


【选项】:[-H] [-L] [-P] [-D debugopts] [-Olevel]这几个并不常用,其中-H,-L,-P三个选项主要用来处理符号链接,

    -H表示只跟随命令行中指定的符号链接;

    -L表示跟随所有的符号链接;

    -P表示不跟随符号链接,默认选项;


【查找起始路径】:根据用户跟定的目标起始路径进行查找,默认是当前目录;


【查找条件】:根据用户指定的标准进行查找;默认是找出指定路径下的所有文件;

    查找条件大致分为以下几类:;

  ①根据文件名进行查找:

        -name;-iname

    如:查找当前目录下以“.cfg结尾的文件” 

        ~]# find . -name "*.cfg"   

 此处匹配时glob通配符匹配不支持正则表达式。使用-iname可不区分字符大小写。

  ②根据文件的从属关系查找:

    -user 用户名:查找属主指定用户的所有文件

    -group 组名:查找属组指定组的所有文件

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

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

如:查找/etc文件下属主为user1的文件:

~]# find /etc -user user1

  ③根据文件类型查找:

    -type (f,d,l,c,b,p,s)

    f:普通文件

    d:目录文件

    l:符号链接文件

    c:字符设备文件

    b:块设备文件

    p:管道文件

    s:套接字文件

如:查找/etc文件下属主为user1的链接文件:

~]# find /etc -user user1 -type l

  ④条件限制,组合使用,匹配多个

    与:-a 默认组合逻辑

    或:-o 

    非:-not或!

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

~]# find /var -user root -a -group mail 

  ⑤根据文件大小查找:

    -size [+/-]#UNIT  (#代表数字,UNIT代表单位)常用单位k,M,G

    #UNIT:(#-1,#] 表示大于#-1,小于等于#的区间

如:查找当前目录下等于3K的文件,

~]# find ./ -size 3k

    -#UNIT:[0,#-1] 表示大于等于0,小于等于#-1的区间

    +#UNIT:(#,∞)表示大于#至正无穷的区间

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

~]# find /etc -size +1M -type f 

  ⑥按时间戳查找:

    linux文件系统中每个文件都有三种时间戳,以天为单位,分别是:

  • 访问时间atime(access time),最后一次访问文件的时间;

  • 状态改变时间ctime(change time),最后一次改变文件的状态或属性的时间

  • 修改时间mtime(modity time),最后一次改变文件内容的时间

    -atime [+/-]# (#代表数字)

    #:[#,#-1) 表示以时间轴为基准,当下时间为原点,从第#天前到第#-1天之间的时间

    -#:(#,0] 表示第#天前到现在的时间

    +#:(∞,#-1]表示包括第#-1天之前的时间

   -ctime [+/-]# 

   -mtime [+/-]# 

还有一种一分钟为单位的表示时间,分别为-amin.-cmin,-mmin用法和atime之间完全一样,就不再举例说明。

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

 ~]# find / \( -nouser -o -nogroup \) -atime -7 -l

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

 ~]# find /etc -mtime -7 ! -user root ! -user hadoop -ls

 ⑦根据权限查找:

    -perm [/|-]mode 

     /mode:表示任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足条件;9位权限之间存在"或"的关系

    -mode:表示每一位用户的权限中的每一位同时符合条件即满足条件;9位权限之间存在"与"的关系

如:

  查找/etc目录下至少有一类用户没有执行权限的文件

    ~]# find /etc ! -perm -111 


【处理动作】对符合查找条件的文件做出操作;默认为输出值标准输出。

-print:输出至标注输出;默认动作

-ls:类似与对查找到的文件执行ls-l命令。输出文件的详细信息

-delete:删除查找到的文件

-fls /path/to/somefile:把查找到的所有文件的长格式信息保持你至指定文件中

-ok COMMAND{}\;:对查找到的每个文件执行COMAND表示的命令;每次操作都由用户进行确认;

-exec COMMAND{}\;:对查找到的每个文件执行COMAND表示的命令;

        注:{}表示匹配到的文件

如:

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

    ~]# find /etc/init.d/ -perm -111 -a -perm -002 -ls

 查找/etc文件下以wd结尾的文件,查看文件内容并将文件内容导入当前目录下file.txt文件中

   ~]# find /etc -type f -name "*wd" -exec cat {} \; > file.txt

    查找/etc目录下一wd结尾的文件,并找出文件中含有root的行

    find /etc/ -name "*wd" -exec grep "root" {} \;


  但是在使用-exec选项时,find是将所有匹配到的文件一次性传递给exec执行,但是有些文件过长,可能会发生溢出错误。

  所以需要注意的是:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;但有些命令不能接受过长的参数,此时命令执行会失败;我们可以使用另一种方式可规避此问题:find | xargs COMMAND

  在此简单说一下xargs命令,之所以能用到这个命令,主要实时由于很多命令不支持管道来传递参数,而平时工作又经常需要,所以有就有了xargs命令xargs是给命令传递参数的一个过滤器,也是组合多个个命令的一个工具。它把一个数据流分割为一些足够小的快,以方便命令进行处理。xargs从管道或者stdin中读取数据,并且以空白字符作为分割,所以,有一些包含空白字符的文件名或特殊意义到的名词时,容易发生误判。

 

如前面的例子改动一下:查找当前目录下以“.cfg结尾的文件” 并删除

        ~]# find . -name "*.cfg" | xargs rm -rf



本文出自 “11448219” 博客,请务必保留此出处http://11458219.blog.51cto.com/11448219/1813854

find命令详解

标签:linux   用户   find   资源   

原文地址:http://11458219.blog.51cto.com/11448219/1813854

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!