find命令
find用于搜索文件名称,其一般格式为:find pathname -expressions
1. find常用表达式
find的表达式分为三类:选择表达式、条件表达式、操作表达式。
表达式 | 类型 | 用途 | 举例 |
---|---|---|---|
-mount | 选择表达式 | 用于防止find命令的搜索范围超出当前文件系统的边界,返回值常为true | (1) |
-group gid或组名 | 条件表达式 | 检查当前的文件是否具有与grp相同的gid或组名 | (1) find . -group hwg -print |
-name pattern | 条件表达式 | 检查文件名和模式pattern是否相同,pattern可以用正则表达式给出,必要时使用引号 | (1) find . -name 'abc*' -print |
-type t | 条件表达式 | 检查当前文件的类型是否是t。t的值:d表示目录,f表示普通文件,l表示符号连接 | (1) find . -type f -print |
-user uid或用户名 | 条件表达式 | 检查当前的文件所有者是否为uid或usr | (1) find . -user hwg -print |
-mtime [+-=]n | 条件表达式 | 检查文件的修改日期 | (1) find . -mtime -4 -print,打印在4天内修改过的文件 (2) find . -mtime +4 -print,打印在4天之前修改过的文件 (3) find . -mtime 4 -print,打印在4天前修改过的文件 |
-size [+-=]n | 条件表达式 | 检查文件的大小 | (1) find . -size +5000k -exec ls -lh {} ; 打印文件大小大于5MB的文件的具体信息 |
-exec cmd | 操作表达式 | 用来执行cmd命令。 如果要将当前的文件名传送给命令,应该加{}标记 ,分号用来表示cmd结束,并和后面可能出现的表达式分开 |
(1) find . -group hwg -exec echo {} ; -print |
操作表达式 | 将当前的文件名送到标准输出设备显示 | (1) find . -print 等价于 find,表示打印当前目录(.)下的所有文件 |
注意:
(1) 如果没有给出pathname,默认为当前工作路径(.)
(2) 如果没有给出操作表达式,默认是-print
2. find的逻辑表达式
支持熔断操作
逻辑表达式 | 描述 |
---|---|
e1 -a e2 | 与运算 |
e1 e2 | 等价于e1 -a e2 |
e1 -o e2 | 或运算 |
e1, e2 | 逗号运算 |
!e1 | 取反运算 |
注意:
区别以下两条命令,涉及逻辑运算符的优先级
命令 | 用途 |
---|---|
find . -name '[Aa]*' -o -name '*[Aa]' -print | 等价于find . \( -name '[Aa]*' \) -o \( -name '*[Aa]' -a -print \) |
find . \( -name '[Aa]*' -o -name '*[Aa]' \) -print | 符合意图:输出以A(或a)开头或以A(或a)结尾的文件 |
3 小测试
统计在/etc为起点的目录树中,文件内容包含字符串'telnet'(不区分大小写)的文件的数目。
find /etc -type f -exec grep -li 'telnet' {} \; | wc -l