1、什么是find?
find命令是一个无处不在的命令,是Linux中最有用的命令之一。find命令用于在一个目录(及子目录)中搜索文件,你可以指定一些匹配的条件,如按照文件名、文件类型、用户、时间戳甚至权限来查找文件。
2、为什么要用find?
每一种操作系统都是由成千上万个不同种类的文件所组成的。其中有系统本身自带的文件,用户自己的文件,还有共享文件等等。我们有时候经常忘记某份文件放在硬盘中的哪个地方。在微软的WINDOWS操作系统中要查找一份文件是相当简单的事情,只要在桌面上点击“开始”-“搜索”中就能按照各种方式在本地硬盘上,局域网络,甚至在INTERNET上查找各种文件,文档。可是使用Linux的用户就没有那么幸运了,在Linux上查找某个文件确实是一件比较麻烦的事情。毕竟在Linux中需要我们使用专用的“查找”命令来寻找在硬盘上的文件。Linux下的文件表达格式非常复杂,不象WINDOWS,DOS下都是统一的xxx.yy格式那么方便查找,在WINDOWS中,只要知道要查找的文件的文件名或者后缀就非常容易查找到。Linux中查找文件的命令通常为“find”命令,“find”命令能帮助我们在使用、管理Linux的日常事务中方便的查找出我们需要的文件。对于Linux新手来说,“find”命令也是了解和学习Linux文件特点的方法。因为Linux发行版本繁多,版本升级很快,在Linux书籍上往往写明某个配置文件的所在位置,往往Linux新手查找半天还是不能找到。比如说CentOS5和CentOS6中有些重要的配置文件所在的硬盘位置和文件目录就有了很大的改变,如果不学会使用“find”命令,那么在成千上万的Linux文件中要找到其中的一个配置文件是相当困难和恐怖的。
3、什么时候用find?
要理解什么时候用find需要先来区别一下几个查找命令的区别:
1)which : 查看可执行文件的位置
2)whereis:查看二进制文件以及命令手册文件
3)locate :通过数据库查看文件位置,
4)find: 实际搜寻硬盘查询文件
从上边几个查询命令的特性不难看出which、whereis、locate都有它们的局限性,只有find命令无懈可击,无论是可执行文件、二进制文件、命令手册文件、或是任何其它普通文件它都可以查找,locate命令和find命令最相似,但是有些新的文件数据库没有更新时通过locate查找不出来,综合来看,find命令是最强大的,虽然速度上有点劣势,但是仍然无法阻挡其成为最好的查找工具。
4、谁需要用find?
如果你经常需要在Linux下查找文件,经常找不到你要的文件或者你用的系统经常升级配置文件位置会变动,那么你就是最需要使用find命令的人,请你毫不犹豫的拿起这把尚方宝剑(find)尽情的挥洒你的自信吧。
5、哪里用find?
find一般用在需要对文件进行实时查找、精确匹配、对速度要求不是非常高的地方。
6、怎么用find?
find命令用法:
find [options] [查找路径] [查找条件] [处理动作]
查找路径:默认为当前目录
查找条件:默认为查找指定路径下的所有文件
处理动作:默认为显示
组合条件:
-a: 与,同时满足
-o: 或,
-not, !:非,取反
非A,并且 非B: 非(A或B)
-not ( -user hadoop -o -iname "*.txt" )
非A,或 非B: 非(A且B)
查找条件:
1)根据文件名来查找,
-name “文件名称”,支持使用globbing
-iname“文件名称”,查找时不区分字符大小写
2)根据属主、属组查找
-user UserName:根据属主查找
-group GroupName:根据属组查找
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
3)根据文件类型查找
-type
f:普通文件
d:目录
b:块设备
c:字符设备
l:符号链接设备
p:命名管道
s:套接字
4)根据文件大小查找
-size [+|-]#unit
常用单位:K,M,G
#:(#-1)<x<=#
5) 根据时间戳查找
以天为单位(time):
-atime [+|-]#
+:表示(#+1)天之外被访问过的
-:表示(#)天之内被访问过
无符号:表示短于(#+1)>x>=#天的时间被访问过
-mtime:和上雷同
-ctime:和上雷同
一分钟为单位(min):
-amin [+|-]#:和上雷同
-mmin [+|-]#:和上雷同
-cmin [+|-]#:和上雷同
6)根据权限查找
-perm [+|-]MODE
MODE:精确匹配
+MODE:任何一类用户的任何一位权限匹配;常用于查找某类用户的某特定权限是否存在
-MODE:每类用户的指定要检查的权限位都匹配
总结:以上知识点的综合应用练习:
1)查找/var/目录属主为root且属组为mail的所有文件;
2)查找/usr目录下不属于root、bin或hadoop的所用文件
3)查找/etc/目录下最近一周内其内容修改过的,且不属于root或hadoop的文件
find /etc/ -mtime -7 -a -not -user root -a -not -user hadoop
查找不到,文件不存在
4)查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件
find / \( -nouser -o -nogroup \) -a -atime -30
5)查找/etc/目录下大于1M且类型为普通文件的所有文件
6)查找/etc/目录所有用户都没有写权限的文件
7)查找/etc/目录下至少有一类用户没有写权限
find /etc/ -not -perm -222
8)查找/etc/init.d/目录下,所有用户都有执行权限且其它用户有写权限的文件
find /etc/init.d/ -perm -113
7、处理动作:
-print:打印在标准输出上
-ls:以长格式输出各文件信息
-exec COMMAND {}\:对查找到的文件执行指定的命令,find把查到的所有文件一次性的传递给-exec所指定的命令
-ok COMMAND {}\:交互式的-exec
8、xargs:
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用,find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去,在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高,而使用xargs命令则只有一个进程,另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
1)在/tmp目录中查找每一个普通文件,然后使用xargs来测试它们分别属于哪类文件
2)在整个系统中查找内存信息转存文件core dump,然后把结果保存到/tmp/sjf
3)在/tmp/目录下查找具有读、写、执行权限的文件,并收回所有用户对它的读取权限:
4)删除/tmp1天以内的所有修改过的文件:
/tmp下原有文件的时间戳
删除后的结果:
5)删除/tmp下大小为0的文件
End。。。。。。。