本文共 2884 字,大约阅读时间需要 9 分钟。
一、简介
在文件系统上常常需要根据文件的各种属性去查找符合条件的文件,文件查找工具有两个,locate和find。
二、分类
文件查找分为:
实时查找:遍历所有文件进行条件匹配(find);
非实时查找:又叫数据库查找,根据索引查找(locate);
三、locate
1.查询系统上预建的文件索引数据库:/var/lib/mlocate/mlocate.db;
2.依赖于事先构建的索引:
索引的构建是在系统空闲时由系统自动进行(周期性任务);管理员手动更新数据库使用updatedb命令;
3.索引构建过程需要遍历整个根文件系统,极消耗资源;
4.工作特点:
查找速度快、非精确查找、模糊查找、搜索的是文件全路径,不仅仅是文件名、可能只搜索用户具备读取和执行权限的目录;
5.格式:locate KEYWORD
搜索名称或路径带有“issue”的文件
OPTION:
-i:忽略大小写的搜索;
-n X:只列举前X个匹配项目;
eg1:使用Regex来搜索以“.sh”结尾的文件
四、find
1.find属于实时查找工具,通过遍历指定路径下的文件系统完成文件查找;
2.工作特点:
精确查找、查找速度略慢、可能只搜索用户具备读取和执行权限的目录;
3.语法:find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:制定具体目标路径,默认为当前目录;
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件;
处理动作:对符合条件的文件做操作,默认输出至屏幕;
4.查找条件
根据文件名和inode查找:
-name "文件名称":支持使用glob *, ?, [], [^]
搜索名为root的所有文件;
-iname "文件名称":不区分字母大小写
-inum n:按inode号查找
-samefile name:相同inode号的文件
-links n:链接数为n的文件
-regex "PATTERN":以PATTERN匹配整个文件路径字 符串,而不仅仅是文件名称
根据属主、属组查找:
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
根据文件类型查找:
-type TYPE:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
根据组合条件查找:
与:-a
或:-o
非:-not,!,条件取反
德·摩根定律:
非(P 且 Q) = (非 P) 或 (非 Q)
非(P 或 Q) = (非 P) 且 (非 Q)
-not(A -a B)=-not A -o -not B:不是A或者不是B;
-not(A -o B)=-not A -a -not B:不是A也不是B;
eg1:查找属主是tom且不是普通文件的文件;
eg2:查找属主是tom和bash的所有文件;
eg3:查找属主是tom且属组不是tom的文件
eg4:查找属主是tom或者属主是bash的文件
eg5:查找属主不是tom也不是bash的文件
eg6:查找数值是bash或者属主UID号为4010的文件
eg7:找出/tmp目录下,属主不是root,且文件名不是fstab的文件
eg8:排除目录:find /etc -path ‘/etc/sane.d’ -a -prune -o-name *.conf
根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G
#UNIT: (#-1, #],如:10k
-#UNIT:[0,#-1], 如:-10k
+#UNIT:(#,∞), 如:+10k
根据时间戳查找:
以“天”为单位;
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#:[0,#)
-mtime;
-ctime;
以“分钟”为单位:
-amin;
-mmin;
-cmin;
根据权限查找:
-perm [/|-]MODE
MODE: 精确权限匹配;
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰;
表示任何一类用户的权限中包含写权限就OK;
-MODE:每一类对象都必须同时拥有指定权限,与关系;
0:表示不关注;
find -perm 755 会匹配权限模式恰好是755的文件;
find -perm /222,只要当任意人有写权限时,就会匹配;
find -perm -222,只有当每个人都有写权限时,才会匹配;
find -perm -002,只有当其它人(other)有写权限时,才会匹配;
处理动作:
-print:默认的处理动作,显示至屏幕;
-ls:类似于对查找到的文件执行“ls-l”命令;
-delete:删除查找到的文件;
-fls file:查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;
对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由 COMMAND指定的命令;
{}: 用于引用查找到的文件名称自身;
find传递查找到的文件至后面指定的命令时,查找到所有符合 条件的文件一次性传递给后面的命令;
有些命令不能接受过多参数,此时命令执行可能会失败,下 面方式可规避此问题 find |xargs COMMAND;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 示例: find -name “*.conf” - exec cp {} {}.org \; ##备份配置文件,添加.orig这个扩展名 find /tmp -ctime +3 -user joe -ok rm {} \; ##提示删除存在时间超过3天以上的joe的临时文件 find ~ -perm -002 - exec chmod o-w {} \; ##在你的主目录中寻找可被其它用户写入的文件 find /data – type f -perm 644 -name *.sh – exec chmod 755 {} \; ##查找.sh结尾权限为644的普通文件,把644文件权限改为755 find /home – type d - ls ##查找/home目录下的目录文件并以长格式显示; |
本文转自wzcLINUXER 51CTO博客,原文链接:http://blog.51cto.com/yacheng0316/1956319,如需转载请自行联系原作者