您的位置:首页 > 运维架构 > Linux

玩转 find -- 完整性的讲述及分析

2013-03-09 21:22 260 查看
find命令
1.1 find概述
1.1.1 介绍
可以对文件进行实时查找,精确查找;find是通过遍历指定目录中的所有文件完成查找所以执行的速度慢
1.1.2查找标准
支持众多查找标准(如支持文件名查找,根据文件权限查找,根据文件类型查找,还可以基于正则表达式对文件名做匹配。
1.1.3 命令格式
find 查找路径+查找标准+查找到以后的处理动作
(1)查找路径:省略的时候默认当前目录
(2)查找标准:默认为指定路径下的所有文件
(3)处理运作:默认为显示到屏幕上
1.2 命令格式详解
直接输入find命令时:可以显示当前目录下的所有文件以及隐藏文件,并且目录的下的子目录文件也显示出来
1.2.1 匹配标准
(1)-name ‘FILENAME’ :对文件名作精确匹配根据文件名查找
例如: find /etc/ -name ‘passwd’ 查找/etc/是否有passwd文件
(2)-iname 'FILENAME' :文件名匹配时 不区分大小写

(3) -regex PATTERN:基于正则表达式进行文件名匹配
(4) -user USERNAME:根据属主查找
例如:find /tmp –user root 查找/tmp 下属主是root的所有文件
(5) -group GROUPNAME :根据属组查找
例如:find /tmp –group root查找/tmp下属组是root的所有文件
(6)支持文件名同配(globbing)
*:任意长度的任意字符
?:匹配任意单个字符(就是代表一个字符)(几个?代表几个字符)
[ ] :指定范围内的任意单个 (文件名同配前面已做详细介绍这里不再过多强调)
例如
find /etc –name ‘passwd*’ 查找以passwd字符开头的所有文件
find /etc -name ‘*passwd’ 查找以passwd字符结尾的所有文件
find /etc -name ‘*passwd*’ 查找文件名包含passwd字符的所有文件
(7)-uid UID:根据UID查找(一个用户被删除后,此前属于这个用户的文件的属主就会变成这个用户此前的ID号)
(8) -gid GID:根据GID查找(一个组被删除后,此前文件的基本组是这个组的文件属组就会变成这个组此前的组ID号)
(9)-nouser :查找没有属主的文件 定期的执行这个命令把那些没有属住的文件都交给管理员,因为没有属主的文件其他用户可能有权限访问或通过一些漏洞获得权限,隐患很大;这个是我们在工作时必须要注意的
例如:find /tmp –nouser 查找tmp下没有属主的文件
(10)-nogroup:查找没有属组的文件
例如: find /tmp -nogroup 查找/tmp下没有属组的所有文件
(11)-type:根据文件类型查找
f:普通文件;d:目录;c;字符设备文件;b:块设备文件;l:链接文件;p:管道文件;s:套接字文件
例如:find /tmp –type d :查找tmp下的所有目录文件
(12)-size:按照大小查找(后不跟单位时,默认单位是字节)
#k;#M;#G; [+|-]#k:大于#k 小于#k(#代表数字)
例如
find /etc –size 10k (大于9k小于等于10k文件都会被查找出来)
find /etc –size -10k(所有小于10k的文件)
find /etc –size +10k(所有大于10k文件
(13)组合条件查找
-a :与条件(如果给出了两个条件没有给连接方式时时默认的就是与逻辑)
例如:find /tmp –nouser –a type d 查找/tmp下没有属主并且不是目录的文件
-o :或条件
-not:非条件
not权限最高 带括号的时候,括号要用反义;与的优先级高于或
(14)按照文件时间戳查找
按天数:
-mtime:根据修改时间查找
-ctime:根据改变时间查找
-atime:根据访问时间查找
例如
find ./ -amin -5查找当前目录下五分钟之内访问过的文件
find ./ -atime +7 查找当前目录下至少七天没有访问过的文件
[+|-]#a,m,c +#:大于# -#:小于 #天m
按天查找:-mmin:根据修改时间查找 -cmin:根据改变时间查找 -amin:根据访问时间查找
(15)按照文件权限查找
-perm MODE 按权限查找 /mode:任意一位匹配都满足条件(/644 600可以 )
-perm 后面直接跟权限是做精确匹配的 如:find ./ -prem 644 精确查找权限是644 的文件 例如:find ./ -perm /644意思是只有有一个符合就行
-mode:文件权限能完全包含此mode时才能显示 每一位必须匹配才行
例如:find ./ -perm -644(查找644的权限文件,755 764 都能匹配到)
1.2.2执行的动作
(1)-print:默认是显示出来
(2)-ls:类似ls -l的形式显示每一个文件的详细

-ok COMMAND \;(以反斜线分号结束,否则是语法错误)
-ok COMMAND {}\; :COMMAND:命令行 每一个操作需要用户确认
-exec COMMAND {} \; :不需要确认
{}就是引用前面匹配到的文件的文件名 然后以\;结尾
例如
find ./ -perm -006 –exec chmod o-w {} \;意思是把权限是006的文件其他用户的写权限去掉
find ./ -name “.*sh” –a –perm -111 –exec chmod o-x {} \; 查找以.sh结尾并且所有用户都具有执行权限的文件,然后把这个文件其他用户的执行权限去掉

find /etc –size +1M -exec echo {} >> /tmp/etc.largefiles \;查找etc下所有大于1M的文件 find /etc –size +1M | xargs echo {} >> /tmp/etc.largefiles 意思同上(不需要反斜线与分号结尾但是需要占位符)
find命令练习题分析:
1、查找/var目录下属主为root并且属组为mail的所有文件;
分析:这个题目比较简单就是查找属主是root属组是mail的文件之间是与的关系,find默认在条件中是与的关系,所以命令如下:
find /var -user root -group mail
2、查找/usr目录下不属于root,bin,或student的文件;
分析:这个题目看着简单,但极易迷惑人,好多人的第一反应就是三者之一是或的关系,真正的意思是所求文件的属主不能是三者的任何一个,所以命令如下:
find /usr -not -user root -a -not -user bin -a -not -user student

find /usr -not \( -user root -o -user bin -o -user student \)

3、查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;
分析:这个题目后面的条件跟上面的相同,前面是“最近一周内访内容修改过”也就是 -mtime -7;所以命令如下:
find /etc -mtime -7 -not \( -user root -o -user student \)

find /etc -mtime -7 -not -user root -a -not -user student
4、查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;
分析:题目是“没有属主或属组”之间是或的关系;“当前系统上”就是“/";后面要修改文件属主数组,使用”{}“引用,以”\;"来结尾这个必须注意;是个细节,容易出错;所以命令如下:
find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;

5、查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;
分析:这个题目难度不大,大于1M的就是“-size +1M” 结果追加到指定路径即可;所以命令如下:
find /etc -size +1M >> /tmp/etc.largefiles
6、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
分析:这个题目做起来自我感觉读起来的时候脑子里想的很清晰,但当去敲命令时,又感觉自己写的有些蹊跷,读起命令的时候又感觉很绕嘴;看到命令后不容易清楚的表达出来;“所有用户都没有写权限”第一意思感觉就是“find /etc -not -perm 555 -ls”其实不然;这个“这个都没有写权限”表达跟上述第二个题目相似;这里用反斜杠表示或的关系;命令如下:

find /etc -not -perm /222 -ls

这些例题易错性比较高,有的不能以第一反应去理解它的题意;是考虑细心的问题;也是我们工作中最应该注意的,后面会继续跟出相关知识点,望继续关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux基本命令