之前在《权当开篇――Linux学习之路(一)》中对find命令做过一些总结,主要介绍的参数为 �Cname �Cinum �Catime �Cmtime�Cctime �Ctype �Ca �Co ! ,但是这些参数并不能完全满足我们在日常使用find 命令进行文件查找时的需求,在这篇博客里我们来做一个更加详细的补充。
注:在进行下面的内容前,可以先看一下上面提到的那篇博客,了解一下 find 命令的基本用法,附链接:
http://xitongjiagoushi.blog.51cto.com/9975742/1619923
1. �Cperm 参数:
-perm 用来查找指定权限的文件,分为精确匹配和模糊匹配,先来看几个例子:
(1)查找 /root 目录下权限为 644 的文件,要求精确匹配:
[root@localhost ~]# find /root �Cperm 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 �Cperm -644 //权限前有�C符号
另外两种写法:
[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 �Cperm /222
另外两种写法:
[root@localhost ~]# find /root �Cperm /r=w,g=w,o=w
[root@localhost ~]# find /root �Cperm /r+w,g+w,o+w
(4)查找 /root 目录下或属主权限有 w ,或属组权限有w:
[root@localhost ~]# find /root �Cperm /220
此时如果属主、属组、其他人都有 w 权限的文件也会被查出。另外两种写法:
[root@localhost ~]# find /root �Cperm /u=w,g=w
[root@localhost ~]# find /root �Cperm /u+w,g+w
(5)查找 /root 目录下至少能被属主和属组 w 的文件:
[root@localhost ~]# find /root �Cperm -220
另外两种写法:
[root@localhost ~]# find /root �Cperm �Cu=w,g=w
[root@localhost ~]# find /root �Cperm �Cu+w,g+w
(6)查找 /root 目录下能够被所有人 r ,且至少有属主、属组或其他用户之一可 w,且所有人不能 x 的文件:
[root@localhost ~]# find /root �Cperm -444 �Cperm /222 ! �Cperm /111
另外两种写法:
[root@localhost ~]# find /root �Cperm �Ca=r �Cperm /a=w ! �Cperm /a=x
[root@localhost ~]# find /root �Cperm �Ca+r �Cperm /a+w ! �Cperm /a+x
总结: -perm 参数有三种匹配权限的方式,假如要匹配的权限为444 ,则:
-perm 444 //精确匹配
-perm -444 //至少 u g o 全部都可 r
-perm /444 //至少 u g o 有一个可 r
! �Cperm /444 //所有人都不可 r
2. -path 排除指定路径:
(1)查找 /root 目录下三天内修改过的文件,不包括 /folder 目录:
[root@localhost ~]# find -path “/folder” �Cprune �Co �Cmtime -3 �Cprint
(2)按“1 �Cperm 参数”中第(6)个例子进行查找,排除 /dira 和/dirb 目录:
[root@localhost ~]# find /root \( -path “./dira” �Co �Cpath “./dirb” \) �Cprune �Co �Cperm -444 �Cperm /222 ! �Cperm/111 �Cprint
例(1)和例(2)分别介绍了排除单个目录和排除多个目录的用法。这里的目录名后面不能带 / ,即如果要排除 /folder 目录,必须写成 �Cpath “/folder” ,而不能写成�Cpath “/folder/”,这里要特别注意。另外, \( 和 �Cpath之间必须有空格隔开,同理,在 “./dirb” 和\) 之间也必须有空格,否则报错导致查询失败。
(3)在(2)的基础上,排除所有子目录中的文件:
[root@localhost ~]# find /root �Cmaxdepth 1 �Cperm -444 �Cperm /222 ! �Cperm /111
这里的 �Cmaxdepth参数指定了查找的最大层级,与其作用相反的参数为�Cmindepth ,如果指定 �Cmindepth 2,则查找的是所有子目录中的文件。这里注意, -maxdepth 和 �Cmindepth 最好放在查询的路径之后,否则虽然可以查询出结果,但会报警告。
3.查看搜索结果的详细信息:
在默认情况下,搜索出来的结果只有文件名,如果想查看其详细信息,有如下三种方法:
[root@localhost ~]# find /tmp �Csize -10M �Cexec ls �Cl {} \;
[root@localhost ~]# find /tmp �Csize -10M | xargs ls �Cl
[root@localhost ~]# find /tmp �Csize -10M �Cls
其中,前两种方法在之前的博客中已经做过介绍,第三种方法为 find 命令自带的参数。
4.查找最大或最小的文件:
(1)查找当前目录下最小的五个普通文件:
[root@localhost ~]# find -type f -exec ls -s {} \; | sort -n | head -5
其中, ls �Cs 参数会列出文件的所占的块的多少,sort �Cn 为按数字由小到大排列。
(2)查找当前目录下最大的五个普通文件:
[root@localhost ~]# find -type f -exec ls -s {} \; | sort -nr | head -5
sort �Cnr 等同于 sort �Cn �Cr,逆序。
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 �Cnewer file1 ! �Cnewer file2
这里 �Cnewer 指晚于 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*’ �Cfprint /root/lucyname.log \) , \( -size +5M �Cfprint /root/bigfile.log \)
这里注意一下,在 \( \) 之间都要有空格,比如 \( 和 �Cname 之间要有空格, \) 和 , 之间要有空格,否则会报错,导致查询失败。(该例的目的是同时执行多次查询)。