linux文件查找
find
文件查找
locate
文件查找:在文件系统上查找符合条件的文件
依赖于事先构建好的索引库
查询系统上预建的文件索引数据库
/var/lib/mlocate/mlocate.db
系统自动实现,周期性任务。
手动创建跟新数据库(updatedb,非常消耗系统资源) 慎用!
工作特性:
查找速度快
模糊查找
非实时查找,可能文件已经有变动或不存在
是全局查找不是针对某个路径查找。针对mlocate.db 这个数据查找
locate [option]...PATTERN...
-b只匹配路径中的基名
-c统计出共有多少个符合条件的文件
-r使用基本正则表达式
locate passwd
默认的搜索是,只要要路径中存在passwd就查找出来。
-b 只查匹配基名部分。
-r 使用正则表达式
locate -br passwd$ 查找基名中passwd结尾的文件
[root@localhost ~]# locate -br ^passwd$
/etc/passwd
/etc/pam.d/passwd
注意:搜索的关键字不用加引号
find命令
实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找
工作特性:
查找速度略慢
精确查找
实时查找
find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
查找起始路径:指定具体搜索目标起始路径;默认为当前目录
查找条件:指定的查找标准,可以根据文件名,大小类型。从属关系,权限、时间戳等标准进行。
默认为,找出指定路径下的所有文件(效果类似ls)
处理动作:对符合查找条件做出的操作,例如删除,默认为输出至标准输出
查找条件:
表达式:
选项和测试组成
测试: 结果通常为布尔型(true,false)
-name “PATTERN” 基于基名查找
-iname “PATTERN” 忽略大小写
PATTERN--->glob风格的通配符
* ? [] [^].....
*
-regex PATTERN 基于正则表达式查找文件
匹配是整个路径,而非基名(用的不多)
组合测试:
与:-a 默认为组合逻辑(多个条件同时符合)
或:-o (or) 满足其中一个条件即可
非:-not , ! 条件取反
选项
根据文件的属主属组查找
~]#find /tmp -user username
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
注:用户被删除,组被删除,没有属主和属组的文件只剩下UID和GID 没有属主和属组
可用 -ls查看
根据文件的类型查找
-type TYPE
f普通文件
d目录文件
l符号链接文件
b块设备
c字符设备
p管道文件
s套接字文件
例: [root@localhost ~]# find /home/yangyouwei -type f
查找条件
组合条件:
与:-a 默认是与
或:-o
非:-not, !
德·摩根定律:
(非P) 或(非Q)= 非(P 且Q)
(非P) 且(非Q) = 非(P 或Q)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
find示例
find -name snow.png
•搜索名为snow.png的文件
find -iname snow.png
•不分大小写地搜索名为snow.png、Snow.png、SNOW.PNG等等的文件
find / -name “*.txt”
find /var –name “*log*”
find-userjoe -groupjoe
搜索被用户joe 以及组群joe所拥有的文件
•find -user joe -not -group joe
•find -user joe -o -user jane
•find -not \( -user joe -o -user jane \)
•find / -userjoe -o -uid500
找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp\( -not -user root -a -not -name 'f*' \) -ls
find /tmp-not \( -user root -o -name 'f*' \) –ls
注-ls动作是对最后一个查找条件的动作。小括号要加转义符
排除目录
•示例:查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf” -print
根据文件大小查找
-size [+|-]#UNIT #为指定大小的数字
常用单位:K.M.G 大写
#UNIT-----(#-1,#】
-#UNIT----【0,#-1)
+#UNIT----(#,无穷大】
-0---------#-1----#----#+1------->无穷大-
| | | |
根据时间戳查找
以天为单位 相对当前时间的第几天
-atime [+|-]#
+#-------(x>=#+1) 前几天之前 x+1
-#------(x<#) 前几天之内 不包括x直到现在
#------(#<=x<#+1) 前第几天 24小时之内
<------------x+1----x----x—1----------0-
| | | |
-mtime
-ctime
以分钟为单位
-amin
-mmin
-cmin
根据文件权限查找
-perm [+|-] MODE
MDOE:精确匹配
MODE 三位数字表示的权限例如664,755,222...
+MODE任何一类用户(U,G,O)的权限中的任何一位用户符合条件既满足条件
find ./ +222 任何一类用只要拥有写即可
find ./ +621 属主有读写或属组有写或其他人有执行权限三种情况符合一种即满足条件
0 表示不关注
-MODE每一类用户的权限中的每一位同时符合条件即满足
find ./ -222 表示每一位权限小于等于2
find ./ -666 包括666,650,550,111但是不包括766
•find -perm 755会匹配权限模式恰好是755的文件
•只要当任意人有写权限时,find -perm +222就会匹配
•只有当每个人都有写权限时,find -perm -222才会匹配
•只有当其它人(other)有写权限时,find -perm -002才会匹配
处理动作:
-print 输出至标准输出;默认动作
-ls 类似于对查找到的文件执行“ls -l”
-delete 删除查找到的文件(慎用)
-fls /PATH/TO/SOMEFILE 查找到文件的长格式信息保存到指定文件中
-ok COMMAND {}\; 对于查找到的文件执行由COMMAND表示的命令,每次都需要用户确认
-exec COMMAND {}\; 对于每次查找到的文件执行有由COMMAND表示的命令,但是不需要用户确认
注意:有些命令不能接收过长的参数此时命令的执行会失败。解决方法,find | xargs COMMAND
find示例
find -name “*.conf” -exec cp {} {}.org \;
•备份配置文件,添加.orig这个扩展名
find /tmp -ctime+3 -user joe -ok rm {} \;
•提示删除存在时间超过3天以上的joe的临时文件
find ~ -perm -002 -exec chmodo -w {} \;
•在你的主目录中寻找可被其它用户写入的文件
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;
find /home –type d -ls
练习
1、查找/var目录下属主为root,且属组为mail的所有文件
[root@localhost ~]# find /var -user root -group mail
/var/spool/mail
2、查找/var目录下不属于root、lp、gdm的所有文件
find /var -not \( -user root -o -user lp -o -user gdm \) -ls
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
find -mtime -7 -not \( -user root -o -user postfix \)
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
[root@localhost ~]# find \( -nouser -o -nogroup \) -a -atime -7
5、查找/etc目录下大于1M且类型为普通文件的所有文件
[root@localhost ~]# find /etc -size +1M -type f
6、查找/etc目录下所有用户都没有写权限的文件
[root@localhost ~]# find /etc/ -not -perm /222
7、查找/etc目录下至少有一类用户没有执行权限的文件
find /etc -perm /666 -ls
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
find /etc/rc.d/init.d/ -perm -110 -perm /002