功能强大的查找命令:find

来源:互联网 发布:nginx 多servername 编辑:程序博客网 时间:2024/05/18 03:47

find命令能够按多种方式指定查询条件,然后进行查询出指定的文件。

说明:因为find命令功能强大,而且能够设定查询条件,里面涉及的权限和文件类型的相关知识,所以大家可以在学完相应的章节后再来学习find命令。

find命令的执行方式:

# find 查找的路径 [选项] [对查询到结果执行的命令]

find命令能够按照用户给定的条件进行查找,并且可以指定查找的路径,它甚至可以在整个文件系统内或者在具有网络文件系统(NFS)的情况下进行查找。

为了方便起见,我们将根据find 命令的选项进行分类说明。

1.根据文件时间状态进行查找

大家还记得介绍touch命令时提到的与文件有关的三个时间吧,所以根据文件时间状态进行查找主要有以下几项:

-atime(+ | -)n:此选项代表查找出n天以前被读取过的文件。
-mtime(+ | -)n:此选项代表查找出n天以前文件内容发生改变的文件。
-ctime(+ | -)n:此选项代表查找出n天以前的文件的属性发生改变的文件。
-newer file:此选项代表查找出所有比file新的文件。
-newer file1! –newer file2:此选项代表查找比file1
文件时间新但是没有file2时间新的文件。

说明:

n为数字,如果前面没有+或者-号,代表的是查找出n天以前的,但是只是一天之内的范围内发生变化的文件。

如果n前面有+号,则代表查找距离n天之前的发生变化的文件。如果是减号,则代表查找距离n天之内的所有发生变化的文件。

-newer file1 ! –newer file2中的!是逻辑非运算符。

下面举例说明,现在想查询一下所有在最近三天之内内容发生变化的文件,可以执行:

# find / -mtime -3 
如果想查找在/home目录下查找比file1新但是没有file2新的文件,则执行命令:
#find /home -newer file1 ! –newer file2

2.根据用户或者组进行查找

系统记录一个用户实际上记录的是它的UID号,而记录组则是记录的GID号,所以根据用户或者组进行查找的选项为:

 -user 用户名:根据文件的属主名查找文件。
-group 组名:根据文件的属组名查找文件。
-uid n:根据文件属主的UID进行查找文件。
-gid n:根据文件属组的GID进行查找文件。
-nouser:查询文件属主在/etc/passwd文件中不存在的文件。
-nogroup:查询文件属组在/etc/group文件中不存在的文件。

说明:

关于用户的UID和GID的说明请查阅用户管理一章。

有时我们可能使用一个用户建立了一些文件,当此用户被删除后,他所建立的文件就成了无属主的文件了,所以我们应该用-nouser来查询,-nogroup与之相同。

下面举例说明,现在想查找所有在/home目录中属主是Ubuntu用户的文件,应执行命令:

# find /home -user ubuntu
查找出/etc/下所有不属于任何人的文件,应执行命令:
# find /etc -nouser

3.根据文件的权限或者大小名字类型进行查找

Linux里的文件是否能够执行与它的扩展名无关,主要是看它是否设置了可执行权限。所以根据文件权限我们也可以设定查找条件:

-name文件名:按找文件名进行查找。
-type文件类型:按文件类型进行查找。
-size[+| -]n(c|k):按照文件尺寸进行查找。
-perm[+| -]文件权限:按照文件权限进行查找。

说明:

文件类型可以通过ls -l命令进行查询,“-”代表普通文件,“d”代表目录。“b”代表设备文件,“c”代表字符设备文件,具体每部分的含义详见文件系统一章。

按文件大小进行查询时,默认的单位是块,因为绝大多数人习惯使用字节或者K等单位,所以我们用“c”表示字节,用“k”表示1024字节。前面如果有“+”号代表大于n所指定的大小,“-”代表小于n所指定的大小,没有的话表示正好等于n所指定的大小。

关于文件的权限设定请参照文件系统章节中权限设定部分,在此不再详述。但需要注意的是此权限应该是4位,即加上了特殊权限位的部分。如果文件权限前面有“+”号,则表示所查找的文件的权限中有前面权限条件的任意一个即可,如果是“-”号,则表示所查找的文件的权限中至少要包含前面权限的所有,比权限条件多没有关系,但一定不能少于权限条件。

下面举例说明,现在想找出/etc目录内所有的文件大小超过1MB的文件,则执行命令:

# find /etc -size +1000000c  

在此处1000000c也可以用1000K来表示。

如果想要找出系统内所有具有SUID位的文件,则执行命令:

# find / -perm -4000  

因为找到的文件必须要具有SUID位,所以要用”-4000”,如果是用“+4000”的话,意思是一个文件只要拥有上述任意一个条件就会被显示出来。

如果想查系统内所有具有SUID,SGID或者黏滞位的文件找出来,可以执行命令:

# find / -perm +7000

这条命令将会把系统内的任意一个只要具有SUID或者SGID或黏滞位的文件都列出来。

4.多个查找选项的应用

有时候需要查找同时符合两个条件,这时需要-a或者-o选项:

 -o:逻辑或,两个条件只要满足一个即可。
-a:逻辑与,两个条件必须同时满足。
# find  /etc -size +2048 -a -size -20480  
在/etc目录下查找大于1MB小于10MB的文件。
# find  /etc -name inittab -o -name grub.conf 

查找/etc目录下文件名为inittab或文件名为grub.conf的文件。

5.对查找到结果的处理

有时候我们对于查找到的结果需要对其进行进一步的操作,这就需要使用-exec或者-ok选项,或者使用-print选项。其使用的格式为:

# find 查找的路径 [选项] [对结果处理的命令]
前三部分就是在前面三节介绍的设定不同的条件,而对结果进行处理的格式为:
-exec  shell命令  {}  \; 

其中-exec就是代表要执行shell命令,后面加的是shell指令,再后面的“{}”表示的是要对前面查询到的结果进行查询,最后的“\;”表示命令结束。需要注意的是“{}”和“\”之间是要有空格的。而-ok选项与-exec的唯一区别就是它在执行shell命令的时候会事先进行询问,-print选项是将结果显示在标准输入上。

例如现在我们想查找系统内所有具有SUID位的文件,并且将结果保存在/root/SUID_file中,则执行命令:

# find / -perm -4000 -exec  ls –l > /root/SUID_file  {} \; 

这样就能够保存结果了,其中的“>”命令是输出重定向,可参考shell基础一章。

其实对于find命令来说它的选项非常多,在此并没有完全列出,另外find命令也可以与通配符进行配合使用,例如,下面的命令就查找/home目录下所有以“.txt“为结尾的文件:

# find /home -name  “*.txt” -ok rm {} \;

0 0
原创粉丝点击