由于Linux一切皆文件,我们的日常运维工作其实就是与文件打交道的事,如何能够快速而有效地找到我们需要的文件呢?这是个令人头疼的问题。幸运是,Linux为用户提供了强大的查找工具——find。find通过遍历指定路径完成文件查找,它的的工作特点:
精确查找——多查询条件组合,精确匹配;
实时查找——遍历指定路径;
查找速度稍慢——由于需要遍历路径,速度上受限于文件数量;
可能只搜索用户具备读取和执行权限的目录——基于Linux系统的用户安全权限。
本文基于 GNU/Linx CentOS 7.2.1511,介绍了find命令的日常用法,主要探讨了find的表达式的各种条件查找:
find详解
1. 命令格式
2. 常用选项
3. 查找条件
3.1. 根据文件名和 inode 查找
3.2. 根据文件类型查找
3.3. 根据属主属组查找
3.4. 根据文件大小查找
3.5. 根据文件时间戳查找
3.6. 根据权限查找
3.7. 多条件查找&德摩根定律
4. 动作处理
结束语
find [OPTION] [PATH...] [expression]
OPTION : 命令选项。所有的选项都总是返回真值,它们总会被执行,除非放在表达式中执行不到的地方。因此,清楚起见,最好把它们放在表达式的开头部分。
PATH... : 搜索路径。 支持多个路径搜索,没有路径参数,缺省用当前目录。还有一个重要方面是,搜索结果的格式取决于正在搜索的路径。若使用的是相对路径,结果也是按相对路径给出;若使用的是绝对路径,搜索结果将都是按绝对路径给出的。
expression :表达式。find的表达式可以分为两个部分:查找条件和处理动作。这也正是find命令的精髓所在。
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
- P 这是默认的行为。当遇到链接文件时,查找条件匹配的是符号链接本身的属性。
-L 当遇到链接文件时,追寻链接文件的目标进行查找。查找条件匹配的是目标文件的属性。
-Olevel 查询优化。优化level分0-3四个等级。
find命令有很多种查找条件,下面我将和大家一起通过实例演示,对常用的查找条件进行介绍:
-name " FILENAME " :支持使用 glob*, ?, [], [^]
-iname " FILENAME" :不区分字母大小写
我们查找/etc/路径下名为passwd的文件,
注意:当我们使用通配符进行查找时,为了防止shell以我们不期望的方式解释通配符,就必须用引号把搜索内容括起来。
-inum N 按 inode 号查找
-samefile FILENAME 相同 inode 号的文件
-links N 链接数为 n 的文件
-regex "PATTERN" 以 PATTERN 匹配整个文件路径字符串,而不仅仅是文件名称
-type TYPE 根据指定文件类型查找文件,支持的文件类型有:
f: 普通文件
d: 目录文件
l: 符号链接文件
s :套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
-user USERNAME 查找属主为指定用户 (UID) 的文件
-group GRPNAME 查找属组为指定组 (GID) 的文件
-uid UserID 查找属主为指定的 UID 号的文件
-gid GroupID 查找属组为指定的 GID 号的文件
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
如上图看到,我们查找的是jacky用户,为什么出来的是zhaoqi用户的呢?我们再来看看jacky和zhaoqi的用户信息:
由此我们可以知道,如果用户名A和用户B,UID相同,查找用户A的话,也能找到B用户的文件,find的用户查找是从系统角度出发,只认UID的。
-size [+|-]#UNIT 常用单位: k, M, G
文件的大小,以指定数字的话(比如10M),一般有三种情况:大于10M、小于10M和等于10M。为了有助于理解,三种情况可以表示为下图:
以“天”为单位的(#UNIT表示用数字指定的时间)
-amin [+|-]#UNIT
-mtime [+|-]#UNIT
-ctime [+|-]#UNIT
以“分钟”为单位的
-amin [+|-]#UNIT
-mmin [+|-]#UNIT
-cmin [+|-]#UNIT
同样的,相对于指定时间,以7天为例,也有三种情况:小于7天、等于7天和大于七天。同样便于理解,以-atime为例示图如下:
-perm [/|-]MODE (MODE表示以8进制数字表示的用户权限)
我们先创建如下文件进行权限查找演示:
我们分别666、-222、/222、/200、-200和400查找:
由示例可以看到:
-perm 666和-perm 400时,需要对应位权限精确匹配
-perm -222时,要求三个权限为都必须是2
-perm /222时,三个权限为任一有2就匹配
-perm /200和-perm -200时,0表示所在位权限不关心。
因此我们得出指定权限的结论:
MODE:精确权限匹配
/MODE:任何一类 (u,g,o) 对象的权限中只要能一位匹配即可,是或关系,(+MODE从 centos7 开始淘汰)
-MODE :每一类对象都必须同时拥有指定权限,与关系0 表示不关注
find多条件查找时,各查找条件是按逻辑关系进行关联起来的。即 组合条件:
与: -a
或: -o
非: -not, !
我们先创建7个文件:
示例一:各条件之间是默认存在-a(与)关系
示例二 :在一般情况下,-a(与) 的优先级高于-o(或),如果需要提高-o(或)优先级,则需要添加 \( \) 把括起来。
示例三:不包含a字符,并且 不包含b字符的文件,即! A -a ! B = ! \( A -o B \)
示例四:不包含a字符,或者 不包含b字符的文件,即! A -o ! B = ! \( A -a B \)
由示例三和示例四可以知道,find多条件间关系是符合德摩根定律的,即:
非(A 且 B) = (非 A) 或 (非 B)
非(A 或 B) = (非 A) 且 (非 B)
看了公式是否有些茫然?为了方便理解,我们来图解德摩根定律:
与: -a ===>且、并集
或: -o ===>或、交集
非: -not, ! ===>非、补集
逻辑关系基础:
-print:默认的处理动作,显示至屏幕;
-ls:类似于对查找到的文件执行“ ls -l”命令
-delete:删除查找到的文件;
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
其中{} \;是固定格式,
{} 用于引用查找到的文件名称自身
\; 结束格式
从示例可知,-ok和-exec实现实现的功能都是一样的,区别在于-ok会进行交互要求用户确认,-exec直接操作。
如你所见,用find命令能够做很多事情。但find命令还能够完成更多的操作,所以真应该查看一下man find页面,或是在互联网上浏览一些相关的优秀教程。find是Linux系统中功能最强大的命令之一,请立即把它用起来吧。
由于初学Linux,限于本人水平有限,文中难免错误纰漏。欢迎各位不吝指教、讨论相关技术。谢谢。
联系我:jacky18676887374@aliyun.com
本文出自 “Zhaoqi Learn To Linux” 博客,请务必保留此出处http://zhaoqifly.blog.51cto.com/3500118/1839541
原文:http://zhaoqifly.blog.51cto.com/3500118/1839541