您的位置:首页 > 其它

多学一点(三)——find 命令详解

2015-07-21 20:47 197 查看
之前在《权当开篇——Linux学习之路(一)》中对find命令做过一些总结,主要介绍的参数为 –name –inum –atime –mtime–ctime –type –a –o ! ,但是这些参数并不能完全满足我们在日常使用find 命令进行文件查找时的需求,在这篇博客里我们来做一个更加详细的补充。注:在进行下面的内容前,可以先看一下上面提到的那篇博客,了解一下 find 命令的基本用法,附链接:http://xitongjiagoushi.blog.51cto.com/9975742/1619923
1. –perm 参数:-perm 用来查找指定权限的文件,分为精确匹配和模糊匹配,先来看几个例子:(1)查找 /root 目录下权限为 644 的文件,要求精确匹配:[root@localhost ~]# find /root –perm 644另外两种写法:[root@localhost ~]#find /root -perm u=rw,g=r,o=r[root@localhost ~]#find /root -perm u+rw,g+r,o+r此时如果在 /root下有文件权限为666 的文件,则该文件不会被查出。(2)查找 /root 目录下权限为 644 或更高的文件:[root@localhost ~]# find /root –perm -644  //权限前有–符号另外两种写法:[root@localhost ~]#find /root -perm -u=rw,g=r,o=r[root@localhost ~]#find /root -perm -u+rw,g+r,o+r此时如果在 /root下有文件权限为666 的文件,则该文件也会被查出。(3)查找 /root 目录下有 w 权限的文件,不论该权限是属主权限、属组权限还是其他用户权限:[root@localhost ~]# find /root –perm /222另外两种写法:[root@localhost ~]# find /root –perm /r=w,g=w,o=w[root@localhost ~]# find /root –perm /r+w,g+w,o+w(4)查找 /root 目录下或属主权限有 w ,或属组权限有w:[root@localhost ~]# find /root –perm /220此时如果属主、属组、其他人都有 w 权限的文件也会被查出。另外两种写法:[root@localhost ~]# find /root –perm /u=w,g=w[root@localhost ~]# find /root –perm /u+w,g+w(5)查找 /root 目录下至少能被属主和属组 w 的文件:[root@localhost ~]# find /root –perm -220另外两种写法:[root@localhost ~]# find /root –perm –u=w,g=w[root@localhost ~]# find /root –perm –u+w,g+w(6)查找 /root 目录下能够被所有人 r ,且至少有属主、属组或其他用户之一可 w,且所有人不能 x 的文件:[root@localhost ~]# find /root –perm -444 –perm /222 ! –perm /111另外两种写法:[root@localhost ~]# find /root –perm –a=r –perm /a=w ! –perm /a=x[root@localhost ~]# find /root –perm –a+r –perm /a+w ! –perm /a+x
 总结: -perm 参数有三种匹配权限的方式,假如要匹配的权限为444 ,则:-perm 444     //精确匹配-perm -444    //至少 u g o 全部都可 r-perm /444    //至少 u g o 有一个可 r! –perm /444  //所有人都不可 r
 
2. -path 排除指定路径:(1)查找 /root 目录下三天内修改过的文件,不包括 /folder 目录:[root@localhost ~]# find -path “/folder” –prune –o –mtime -3 –print(2)按“1 –perm 参数”中第(6)个例子进行查找,排除 /dira 和/dirb 目录:<
4000
/p>[root@localhost ~]# find /root \( -path “./dira” –o –path “./dirb”  \) –prune –o –perm -444 –perm /222 ! –perm/111 –print例(1)和例(2)分别介绍了排除单个目录和排除多个目录的用法。这里的目录名后面不能带 / ,即如果要排除 /folder 目录,必须写成 –path “/folder” ,而不能写成–path “/folder/”,这里要特别注意。另外, \( 和 –path之间必须有空格隔开,同理,在 “./dirb” 和\) 之间也必须有空格,否则报错导致查询失败。(3)在(2)的基础上,排除所有子目录中的文件:[root@localhost ~]# find /root –maxdepth 1 –perm -444 –perm /222 ! –perm /111这里的 –maxdepth参数指定了查找的最大层级,与其作用相反的参数为–mindepth ,如果指定 –mindepth 2,则查找的是所有子目录中的文件。这里注意, -maxdepth 和 –mindepth 最好放在查询的路径之后,否则虽然可以查询出结果,但会报警告。
 
3.查看搜索结果的详细信息:在默认情况下,搜索出来的结果只有文件名,如果想查看其详细信息,有如下三种方法:[root@localhost ~]# find /tmp –size -10M–exec ls –l {} \;[root@localhost ~]# find /tmp –size -10M | xargsls –l[root@localhost ~]# find /tmp –size -10M –ls其中,前两种方法在之前的博客中已经做过介绍,第三种方法为 find 命令自带的参数。
 
4.查找最大或最小的文件:(1)查找当前目录下最小的五个普通文件:[root@localhost ~]# find -type f -exec ls -s {} \; | sort -n | head -5其中, ls –s 参数会列出文件的所占的块的多少,sort –n 为按数字由小到大排列。(2)查找当前目录下最大的五个普通文件:[root@localhost ~]# find -type f -exec ls -s {} \; | sort -nr | head -5sort –nr 等同于 sort –n –r,逆序。
 
5.其他常用查询条件:
  这里在没有特殊说明的情况下,均以搜索当前目录为例:(1)查找文件名为hello.txt 的文件,名称不区分大小写:[root@localhost ~]# find -iname hello.txt(2)查找系统中属于作废用户的文件,即文件属主在 /etc/passwd 中不存在:[root@localhost ~]# find -nouser同样,查找在系统中属于作废用户组的文件:[root@localhost ~]# find -nogroup这种文件一般来说比较危险,最好及时清除。这种文件的一种产生来源是网上下载的软件源码包(需要编译安装的那一种),在解压缩/解包以后,其属主和属组为 1000,在/etc/passwd 和 /etc/group 中不存在。(3)查找在系统中属主为 lucy 的文件:[root@localhost ~]# find -user lucy如果知道属主 lucy的 uid 为521,如下命令查询效果相同:[root@localhost ~]# find -uid 521同样,查找在系统中属组为 lucy 的文件:[root@localhost ~]# find -group lucy如果知道属组 lucy的 gid 为521,如下命令查询效果相同:[root@localhost ~]# find -gid 521(4)查找文件修改时间(mtime)在 /etc/passwd 文件的修改时间之后的文件:[root@localhost ~]# find -newer /etc/passwd对应的,访问时间(atime)参数为 -anewer ,改变时间(ctime)参数为 -cnewer 。(5)查找 /tmp 和 /usr 目录中的所有文件:[root@localhost ~]#find /tmp /usr   //多个目录间以空格隔开(6)查找 mtime 比 file1 晚,且比file2 早的文件:[root@localhost ~]# find –newer file1 ! –newer file2这里 –newer 指晚于 mtime, -anewer 指晚于 atime, -cnewer 指晚于 ctime。有关如何指定文件的 atime 和 ctime ,可以参考如下博客:http://xitongjiagoushi.blog.51cto.com/9975742/1632840(7)查找/tmp 目录中文件名前四位为 lucy,将其记录到 /root/lucyname.log 中,同时查找 /tmp 目录中大小超过 5M 的文件,将其记录到 /root/bigfile.log 中:[root@localhost ~]# find /tmp \( -name ‘lucy*’ –fprint /root/lucyname.log \) , \( -size +5M –fprint /root/bigfile.log \)这里注意一下,在 \(  \) 之间都要有空格,比如 \( 和 –name 之间要有空格, \) 和 , 之间要有空格,否则会报错,导致查询失败。(该例的目的是同时执行多次查询)。

本文出自 “细桶假狗屎” 博客,请务必保留此出处http://xitongjiagoushi.blog.51cto.com/9975742/1625776
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: