在Linux中,find命令用于在指定目录下搜索文件和目录,并根据指定的条件进行匹配。我认为是最常用的查找文件工具之一了,另外的文件查找工具locate
、whereis
、which
后面会专门介绍一下,在日常工作中个人觉得也没有find用得多。
参数介绍
语法格式如下:
find [path] [options] [expression]
- path 指定搜索的路径,默认为当前目录
- options 指定find命令的各种选项,如搜索深度、时间条件等。 后面会单独把常用参数罗列出来。
- expression 指定搜索的条件和操作,如文件名、大小、权限等。
常用参数和表达式
参数 | 含义 |
---|---|
name | 按照文件名进行匹配,可以使用通配符 *、?、[]、[^] |
iname | 类似于-name ,但忽略大小写 |
maxdepth/mindepth | 按目录深度查找 支持最大深入和最小深入设置 |
type | 文件类型进行匹配,如f 表示普通文件,d 表示目录,l 符号链接文件,s 套接字文件 ,b 块设备文件,c 字符设备文件,p 管道文件 |
size | 文件大小进行匹配,可以使用+ 或- 来指定大于或小于某个大小。单位为c/k/M/G+50k: 搜索大于50k的文件 -50k: 搜索小于于50k的文件 |
mtime | 修改时间进行匹配,可以使用+ 或- 来指定在多少天之前或之后修改的文件 |
user | 文件所属用户进行匹配 |
group | 文件所属用户组进行匹配 |
perm | 文件权限进行匹配,可以使用八进制或符号表示法 |
exec | 对匹配的文件执行指定的命令。 |
delete | 删除匹配的文件 慎重使用 |
案例
在开始之前说明一下,在find命令中,可以把命令拆分为 where(匹配条件),action(处理方法) 2个逻辑去学习,匹配条件就是找到匹配的文件列表,处理方法就是 找到了文件之后 做一些什么样的处理操作。
根据name 和iname 模糊匹配
find /opt/docker-script/ -name "*.yaml"
/opt/docker-script/redis.yaml
/opt/docker-script/nginx.yaml
#iname 区分大小写
find /opt/docker-script/ -iname "*.yaml"
/opt/docker-script/redis.yaml
/opt/docker-script/nginx.yaml
根据深度匹配
# 深入为1 没有查询到数据
find /opt/ -maxdepth 1 -iname "*.yaml"
#深入为2 查询到了
find /opt/docker-script/ -maxdepth 2 -iname "*.yaml"
/opt/docker-script/redis.yaml
/opt/docker-script/nginx.yaml
根据文件宿主查找匹配
# 找到指定用户的frm后缀的数据库表文件
find /usr/local -user mysql -iname "*.frm"
#用户宿主相关参数还支持以下参数:
-user username 属主为指定用户名的文件
-group groupname 属组为指定组名的文件
-uid UseerID 属主为指定的UID号的文件
-gid GroupID 属组为指定的GID号的文件
-nouser 没有属主的文件
-nogroup 没有属组的文件
根据文件大小查找
#查找指定目录下 大于500k的文件 支持的单位有k M G
find /usr/local/mysql/data -size +500k
其中+500k表示 大于500k的文件
- +500k 大于500kb >=500kb
- -500k 小于500kb <500kb
- 500k 表示499k-500k之间 (n-1至n)
根据时间戳或者分钟查找
#7天内修改过的文件
find /usr/local/mysql/data -mtime -7
#7天之前修改过的文件
find /usr/local/mysql/data -mtime +7
#1分钟内被修改的文件
find /opt/data/mysql/data/ -mmin -1
文件的时间戳分为:
- 创建的时间(
ctime
) c=create - 修改的时间(
mtime
) m=modify - 访问的时间(
atime
) a=access
文件的分钟单位和时间戳类似 也分为了cmin、mmin、amin 分别对应 创建时间分钟数、修改时间分钟数、访问时间分钟数。
同样的和size类似 数值前可以加 +/-号来表示不同的含义
- +表示多少之前被访问过
- -表示多少之内被访问过
多条件表达式
多条件就是在查找文件的同时用多个条件去查找支持and、not 、or
- -a 表示and
- -o 表示或者
- ! 表示非 取反的意思。
如下表示查询/opt目录下 .zip 或 .gz 的文件
find /opt/ -name "*.zip" -o -name "*.gz"
处理动作
find命令的处理动作是指根据上面查找到的文件需要做一系列的后置处理,比如查询到.zip 或 .gz文件后 把目录输出到一个txt文件中:
find /opt/ -name "*.gz" -o -name "*.zip" -exec echo "{}">>sumzipgz.txt \;
常用的后置处理动作参数:
- -ls 相当于多执行了ls -l
- -exec 执行命令 {}表示查询的参数 ;语法要求 结尾必须加上
- -ok 和exec类似,多了一个需要用户在终端输入Y/N进行确认操作
- -delete 直接删除查找的数据
- -print 默认print处理方法 查找后输入的终端命令行中。