前言
我们知道,文本查找工具有grep、egrep和fgrep,他可以根据我们所给出的模式行匹配的去搜索某文件中符合我们所要找的内容,对我们搜索文本内容很方便,功能也很强大,但他也只不过可以搜索文本内容而已,仅此而已了,如果我们想查找当前系统中有没有某个文件或某个文件在什么位置,那我们的grep恐怕是无能为力了,那我们该怎么办呢?别急,那现在我们就来说说查找文件的工具吧!
正文
find命令闪亮登场;早先在Linux系统上文本查找有两个:
一是locate,在CentOS6上这个工具并不是默认就提供的,想要用得自己去安装,locate工作特性有点像whatis,首先他要依赖于数据库的,其次就是非实时查找的,精确度不是100%的,但查找速度比较快,当然,我们今天的重点不是说他,也了解一下就OK了;
二是find,相对于locate而言,首先find是精确查找、他会根据我们所给出的目录逐步翻遍去查找文件,当然速度慢点;其次是精确匹配的,想找哪个文件就是哪个文件,而且只提供文件本身。
find的标准格式:
find [options] [查找路径] [查找条件] [处理动作]
[]的这些都可以不给出,如果都不给就是查找当前目录下的所有文件
查找路径:如果不给默认是查找当前目录
查找条件:默认为查找指定路径下的所有文件
处理动作:默认显示输出
首先:查找路径,查找路径就不用多说了、给出想要查找的路径就可以了;其实find命令是很消耗资源的,不要有事没事去find一下根,那就不好玩了(^@@^)。
其次:查找条件,这个才是今天的重点呀,说了那么多才到重点,是不是前面说得有点多了(^@@^),下面我们来例举一下常用的查找条件:
以下的例子基本上都是以笔者机器上的/tmp/b/路径下的文件做示例,里面都有我建好的一些文件、如下图所示:
-name:指上"文件名称",这是做精确查找的,区分大小写的,只在你所给定的路径下找确定的文件名的文件,名称中有空白要用引号引起来,支持使用文件名通配机制。
例:查找/etc下文件名为passwd的文件:
# find /etc/ -name "passwd"
例:查找/etc下文件名为passwd开头的文件:
# find /etc/ -name "passwd*"
例:查找/etc下文件名为passwd结尾的文件:
# find /etc/ -name "*passwd"
文件名通配的机制中还有:(这里就不一一例举了)
*:可匹配一个或多个字符
?:匹配单个字符,一个问号只能代表一个字符
[]:[h5]*表示以h和5开头的文件;*[6-9]*表示含有6到9其中一个数字的文件
[^]:表示取反
-iname:不区分字符大小写查找
# find /tmp/b/ -iname "h*"
-user:根据属主去查找
例:查找/tmp/b下属主为openstack的文件
# find /tmp/b/ -user "openstack" | xargs ls -l
-nouser:查找没有属主的文件
例:查找/tmp/b下没有属主的文件
# find /tmp/b/ -nouser | xargs ls -l
这两个文件的所属的用户被笔者删除了、所以只显示他之前的ID号、ID与用户名只是一个映射关系、删除用户时不加-r是不会删除用户所属的文件的。
-group:根据属组去查找
例:查找/tmp/b下属主为fedora的文件
# find /tmp/b/ -group "fedora" | xargs ls -l
-nogroup:查找没有属组的文件
例:查找/tmp/b下没有属组的文件
# find /tmp/b/ -nogroup | xargs ls -l
-uid:根据用户ID查找的文件
例:查找/tmp/b下用户ID为500的文件
# find /tmp/b/ -uid 500 | xargs ls -l
-gid:根据用户属主ID查找查找
例:查找/tmp/b下属主ID为4007的文件
# find /tmp/b/ -gid 4007 | xargs ls -l
组合条件:
-a:与,同时满足,可以省略不给
-o:或,其中一个条件满足就可以了
-not,!:非
例: 查找/tmp/b/下属主不是root并且没有属组的文件
# find /tmp/b/ -not -user root -nogroup | xargs ls -l
例: 查找/tmp/b/下属主不是root并且文件名以不是以.sh结尾的文件
# find /tmp/b/ -not -user root -not -name "*.sh"
=# find /tmp/b/ -not \( -user root -o -name "*.sh" \)
-type:根文件类型查找、这个比较简单
f:查找普通文件
d:查找目录文件
b:查找块设备
c:查找字符设备
l:查找符号链接
p:查找命名管道
s:查找套接字
例如:查找/tmp/b/下所有目录文件
# find /tmp/b/ -type d
-size:根据文件大小查找
-size [+|-]#unit #:(#-1)<x<=# 常用单位:K, M, G
例如:# find /tmp/b/ -size +2M +2M表示大于2M的文件
例如:# find /tmp/b/ -size -2M -2M表示小于1M以下的文件
例如:# find /tmp/b/ -size 2M 2M表示大于1M小于2M的文件
所在总结出下图:
根据时间戳查找:
以天为单位(time)
-atime [+|-]#:按访问时间查找
-2:表示2天内被访问过
+2:表示3天之内被访问过、就是#+1天
2:表示适于第3天到第2天的时间段被访问过(#+1)>#>=#
-mtime:按修改时间查
-ctime:按改变时间查找
以分钟为单位的(min)同样这里的加减也跟以天为单位的一样换算
-amin:按多少分钟访问的时间查找
-mmin:按多少分钟修改的时间查找
-cmin:按多少分钟改变的时间查找
时间的也跟-size一样,总结出下图:
根据权限查找:
-perm [+|-]mode:
Mode:权限精确匹配
+Mode:任何一类用户(属主、属组、其他)的任何一位权限(读、写、执行)匹配,常用于查找某类的某特定权限是否存在。
-Mode:每类用户的指定要检查的权限位都存在
什么意思呢,我们来看一下例子吧:
例:查找/tmp/b/下其他用户有执行权限的文件
# find /tmp/b/ -perm +001 只要文件中其他用户有执行权限的都满足
例:# find /tmp/b/ -perm -611
精确匹配:#find /tmp/b/ -perm 755
处理动作:
-print:打印在标准输出
-ls:以长格式输出各文件信息
-exec commad {} \;:{}表示占位符反斜线前要带空格,后面要带分号
-ok command {} \; :交互式的-exec;
例:查找其他用户有写有执行权限的文件并且为普通文件并且把其他用户的权限改为只有读权限:
# find /tmp/b/ -perm -003 -type f -exec chmod o=r {} \;
这条命令是什么意思呢:find /tmp/b/ -perm -003 -type f命令查找到的所有文件一次性传递给-exec,然后交给chmod o=r来执行的,所以-exec的作用就在这里了。
注意:上面的命令中把-exec换成管道是不成功的,find的命令流是一次性把找到的文件直接送往后方的,所以这种管道不能简单的直接送往后方命令对齐来执行的,因为管道传送过来的字符串,而这种字符串是不能当命令的参数使用的,# find /tmp/b/ -perm -003 -type f | tr 'a-z' ''A-Z 这样就可以,因为tr命令就是处理字符串的,或者用命令替换:# chmod o=r `find /tmp/b/ -perm -003 -type f`
以上的情况如果在一次查找的文件非常多,当他一次性传递过来哪就会出现命令溢出,所以我们结合管道用xargs来实现;
如:# find /tmp/b/ -perm -003 -type f | xargs chmod o=r
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
既然xargs比-exec那么好、为什么还要用呢、比如:我们把/tmp/b/下把.sh结尾的文件统统改为.shx,来看看:
# find /tmp/b/ -name "*.docx" -exec mv {} {}x \;
结束:
find的命令功能强大,也经常用到,让我们在后面使用时再感受他的强大威力吧,大概常用的功能也就这些了,先总结到这里了,如有什么欠妥的地主或不到这处还望读都海涵,总结自己的同时也希望能帮到你、在此谢谢你耐心的读完!