find命令详解

简介:

    Linux中的文件查看工具有两种:find和locate。locate是非实时性的,不准确,是根据事先建立的数据库来查找的,速度较快。find是根据文件属性信息在系统中实时查找的,能精确的匹配,可以指定路径,文件类型,可以根据文件大小,属组属主,时间戳等查找,查找到文件之后还可以做相应的操作。由于find的特点,在linux中应用非常广泛,也非常重要。


   一,find命令用法

   find的使用格式为:find [dir...] [criteria...] [action]
   如果不指定目录,则默认为当前目录
   如果不指定条件,则默认为全部条件
   如果不指定动作,则默认为显示出来
ctiteria即条件常用的有:
   -name "filename" 严格区分大小写,查找指定的文件名

   例:find -name "test" 在当前目录查找test文件


   -iname "filename" 不区分字母的大小写
   -regex "pattern"  对搜索结果的整个路径按正规表达式进行过滤,必须对全路径考虑

   例:find / -regex ".*/find" 查找根下文件名是find的文件


   -user username 指定属主

   例:find /tmp -user root  查找tmp中属主是root的文件


   -group groupname 指定属组

   例: find /tmp -group root 查找tmp中属组是root的文件


   -uid 指定uid,查找属主

   -gid 指定gid,查找属组


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

   例:find /var/tmp -nouser  


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

   注意:当一个用户被删除之后,用户先前建立的文件,也就没有了属主属组


   -type 指定文件的类型进行查找,后面可以跟:f:普通文件;d:目录文件;l:链接文件;b:块设备文件;c:字符文件;p:管道文件;s:套接字文件

   例:find /tmp -type d 查找tmp中的目录文件


   以上是基本的条件,而当我们需要多个条件的时候,可以用:(优先级:非>与>或)
   -a 与  默认情况,不指定条件之间关系的话是“与”
   例:find /tmp -iname "*lc*" -a -user root 查找tmp中文件名中有lc字符并且属主为root的文件
   -o 或  
   例:find /tmp -iname "*lc*" -o -user root 查找tmp中文件名中有lc字符或是属主为root的文件
   -not 非(也可使用!)对一个条件取反
   例:find /tmp -not -iname "*lc*" -not -user root 查找tmp中文件名不包含ls字符并且属主不是root的文件

      find /tmp -not \( -iname "*lc*" -o  -user root \) 主要括号中的空格;这两个的意思是一样的,你懂的...


   -size 指定一个数值和单位,k,G,M,默认为字节
   例:find /tmp -size 10M  在/tmp中查找10M左右的文件(上下波动不在1个单位内)
       find /tmp -size +10M 查找大于10M的文件

       find /tmp -size -10M 查找小于10M的文件


  -amin 指定访问时间 单位分钟
  -mmin 指定修改时间 单位分钟
  -cmin 指定改变时间 单位分钟
  -atime 指定访问时间  单位是天
  -mtime 指定修改时间  单位是天
  -ctime 指定改变时间  单位是天
  例:find /tmp -ctime 3 在tmp中查找在过去的第三天改变的文件
      find /tmp -mtime -3 在tmp中查找在过去的三天内修改的文件

      find /tmp -atime +3 在tmp中查找在过去至少三天没有访问的文件


  -perm 根据文件权限查找
  例:find /tmp -perm 655  查找权限是655的文件
      find /tmp -perm +655 查找三类用户权限中只要有一类用户的一位权限位符合条件就匹配,即(属主只要有读或写权限)或是(属组只要有读或执行权限)或是(其他用户有读或执行权限),这三个只要有一个满足就匹配(0表示匹配任何权限)
      find /tmp -perm -655  三类用户中的权限位必须都符合条件才匹配,即文件的权限必须是655(0表示匹配任何权限)
   action即动作:
   -print 显示匹配的文件,默认就是这个动作
   -ls    显示的时候用长格式显示文件的属性信息
   例:find /tmp -type d -ls 查找tmp中目录文件,并列出其详细信息
   -exec COMMAND {} \;查找到文件后执行命令
   例:find /tmp -name "a.txt" -exec rm {} \; 在tmp中查找到a.txt文件后将其删除

  -ok 与-exec不同的是会在执行操作前提示是否执行


  -maxdepth 只在第一层目录中查看,不进行递归查找

   例:find /opt/www/ -maxdepth 1 -type f -exec rm -rf {} \;  只会在/opt/www的第一层目录中查找文件,并删除


   -wholename 后面能跟模式,匹配find输出文件的完整的路径信息。从文件整个路径的/开始到这个文件之间匹配

   例1:

   [root@yd_82_231 ~]# find /root -wholename '/root*py'

   /root/python/class.py

   /root/python/check_redis.py

   即find搜索到的整个文件路径必须是:以/root开头,以.py结尾

   例2:

  [root@yd_test ~]# find . -wholename './py*py'

  ./python/class.py

  ./python/check_redis.py

   即find搜索到的整个文件路径必须是:以.py开头,以.py结尾


   -prune 不搜索指定的文件

   例1:

  [root@yd_82_231 ~]# mkdir python

  [root@yd_82_231 ~]# mkdir pythonnnn

  [root@yd_82_231 ~]# find ./ -maxdepth 1 -path './python*' -prune -o -type d -print

  ./

  ./.python-eggs

  ./.ssh

  当前目录中以python开头命令的所有目录都会被忽略

  例2:

  [root@yd_test ~]# find ./ -maxdepth 1 -wholename './python*' -prune -o -type d -print

  用-path和-wholename的效果用法是一样的


 

二,find与xargs

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

来看看xargs命令是如何同find命令一起使用的:

   find . -type f -print | xargs file 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

   find / -name "core" -print | xargs echo "" >/tmp/core.log 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:

   find . -type f -print | xargs grep "hostname" 用grep命令在所有的普通文件中搜索hostname这个词

   find ./ -mtime +3 -print|xargs rm -f –r 删除3天以前的所有东西 (find . -ctime +3 -exec rm -rf {} \;)

   find ./ -size 0 | xargs rm -f & 删除文件大小为零的文件

   find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

   










本文转自 leejia1989 51CTO博客,原文链接:http://blog.51cto.com/leejia/787168,如需转载请自行联系原作者
目录
相关文章
查找文件夹内所有文件
查找文件夹内所有文件
87 0
|
存储 Linux Shell
厉害了!除了find命令,还有这么多文件查找命令,高手必备!
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 在系统里查找文件,是所有工程师都必备的技能(不管你用的是 Windows 、Linux、还是 MacOS 系统)。
厉害了!除了find命令,还有这么多文件查找命令,高手必备!
|
Shell
find命令小结
背景:由于机器上log日志比较多,所以想写个脚本定时清理日志   find  /apps/logs/log_receiver -mtime +7 -name "*[log|err]" -exec rm -f {} \;   使用find命令来做这个事情 find [-H] [-L] [-P] [path.
880 0
|
机器学习/深度学习
|
分布式计算 Hadoop
|
Linux PHP JavaScript