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命令,后面加的是shell指令,再后面的“{}”表示的是要对前面查询到的结果进行查询,最后的“\;”表示命令结束。需要注意的是“{}”和“\”之间是要有空格的。而-ok选项与-exec的唯一区别就是它在执行shell命令的时候会事先进行询问,-print选项是将结果显示在标准输入上。
例如现在我们想查找系统内所有具有SUID位的文件,并且将结果保存在/root/SUID_file中,则 执行命令:
# find / -perm -4000 -exec  ls –l > /root/SUID_file  {} \; 
这样就能够保存结果了,其中的“>”命令是输出重定向。
其实对于find命令来说它的选项非常多,在此并没有完全列出,另外find命令也可以与通配符进行配合使用,例如,下面的命令就查找/home目录下所有以“.txt“为结尾的文件:
# find /home -name  “*.txt” -ok rm {} \;

6、忽略某个目录

如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。

如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:

$ find /apps -path "/apps/bin" -prune -o -print
7、使用find查找文件的时候怎么避开某个文件目录

比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件

find /usr/sam -path "/usr/sam/dir1" -prune -o -print

find [-path ..] [expression] 在路径列表的后面的是表达式

-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o
-print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path "/usr/sam" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path "/usr/sam" -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。

这个表达式组合特例可以用伪码写为

if -path "/usr/sam"  then
          -prune
else
          -print

 

避开多个文件夹

find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print

 

圆括号表示表达式的结合。
 

\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。

查找某一确定文件,-name等选项加在-o 之后

#find /usr/sam  \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print