在Linux下,find命令主要是用来在目录结构中搜索文件,而且是对硬盘进行实时的搜索,并执行指定的操作。而且Linux给予find许多的搜索条件选项,而也正因为这些条件选项的存在,find这一命令十分的强大。这里就对它的几个常用选项进行分析,在分析find命令的选项条件之前,先了解一下Linux下使用find命令的大致结构:
首先,我们先来解释pathname,顾名思义,指的是路径名,就是你想通过find命令从哪个地方开始查找,需要指出的默认路径是当前目录,用"."来表示当前目录,"/"表示根目录;
而对于express当中的三个部分,选项这个我们放在后面讲,对于条件这个部分,无非就是true或者false,只有当条件为true的时候才会执行后面的动作部分,当然这里条件默认是true;对于执行动作这个部分,要具体分析,这里也有默认值,也就是print(即在屏幕上进行打印)。
说到这里,大致对于find命令有了一个粗略的轮廓,这里我们就仔细看看find命令复杂的选项中的几个常用选项:
1.-name :按照文件名来进行查找
这里“~”表示主工作目录,而且除了“~”这个符号之外,还有“*”,“?”,“[ ]”对于字符串中内容进行补全,而且在使用这些字符在顶替文件名中的某些内容的时候,最后加上引号或在关键地方加上“\”来进行转义,防止内容误读
“*”可以对给出的字符串进行自动补全,也就是把满足具体给出条件的名字的文件都找出来,能够顶替多个字符
“?”虽然同样是进行字符串的补全,但是只能顶替单个字符
“[ ]”是用[ ]中的每一个字符单独取出与外面的内容进行组合成文件名
另外-iname与-name的功能大致一样,只是-iname不区分大小写
2.-prune:不在指定的目录中进行查找,而且在于-depth同时出现的时候,find命令忽略-prune选项
这里要对上面的这句话进行分析一下,以-o为界限,当前语句的前半句意思是在解析文件目录的时候遇到./MYBIN的时候为true即执行-prune(不解析这个目录),而且由于-o(逻辑或),只有在前半句为false的时候才执行后半句;而对于其他路径而言,前半句条件为false,所以就执行后半句,查找名为test.c的文件并执行默认打印路径。
3.-perm:按照文件权限进行查找
这里解释一下-exec ls -l {} \;这部分语句,-exec的意思是用查找到的结果以后面的shell命令进行执行;与它类似的还有-ok,只不过-ok在每执行shell命令前都会让用户进行一次判断,更加的安全。
4.-user:按照文件拥有者来进行查找;-group:按照文件所属组来进行查找
除了上面的以外,-nogroup: 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在;
-nouser :查找无有效拥有者的文件,即该文件的属主在/etc/passwd中不存在。
5.-type:查找某一类型的文件
b - 块设备文件;
d - 目录;
c - 字符设备文件;
p - 管道文件;
l - 符号链接文件;
f - 普通文件。
可以很明显的发现所有显示出来的文件均为普通文件
6.-mtime:按照文件更改时间来查找
-mtime +n-----------表示查找更改时间在n天之前的文件
-mtime -n-----------表示查找更改时间在n天之内的文件
仔细观察发现,原本我们只想要更改时间在一天以内的文件,可是上图很明显,除了红线框出来的以外更改时间均不在1天以内,这里原因在于-exec ls -l {} \;这后半句,因为在Linux下目录也是文件,而ls -l的目标是一个目录的话,那这个目录中的文件不就都显示出来了吗?为了验证这种说法,我们还可以对这条语句在加上文件类型的限制:
这样就把1天之前的普通文件统统过滤出去了。
find命令除了-mtime以外,还有-atime和-ctime选项,但它们的用法都和-mtime选项相同,只不过-mtime是以更改时间(Modify 时间)为根据的,而-atime和-ctime则是分别以访问时间(Access时间)与改变时间(Change时间)为根据的【至于Modify,Access,Change三个时间可参照http://blog.csdn.net/chenkaixin_1024/article/details/64924059这篇文章的末尾】。
当然除了以天数为参考的查找,也有以分钟为单位的查找(-amin,-cmin,-mmin除了参考单位不同,其他与上述一致)
7.-newer:find pathname "file1" -newer "file2"-----在pathname目录下查找更改时间比file1早,但比file2晚的文件;
8.-size +n[c]/-n[c]/n[c]:查找文件长度为n块的文件,带有c时表示文件长度以字节单位计(1块=512字节)
+n[c]-----表示查找文件长度大于n的文件;
-n[c]-----表示查找文件长度小于n的文件;
n[c]-----表示查找文件长度等于n的文件;
9.-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
为了验证-depth的功能,我们先建立一个目录的嵌套结构:test下包含l1,l1下包含l2,l2下包含l3
上面所给的-empty选项代表查找为空的目录或文件,而! -empty则是查找不为空的目录或文件;
原本是先从当前目录开始查证,加上-depth则是从最深的子目录开始查证。
另外,-maxdepth n表示查找的最大深度为n;-mindepth n则正好相反
总结:
find命令其实还有许多其他选项,但上述是常用的几项,而且不同选项可以通过不同的组合,从而达到不同的目的。
例如:find -name test -type f -exec ls -l {} \;用来查找名字为test的普通文件,并且以ls -l的命令进行操作。