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

之前在《权当开篇――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 之间要有空格, \) , 之间要有空格,否则会报错,导致查询失败。(该例的目的是同时执行多次查询)。


你可能感兴趣的:(linux,find,命令详解)