在Linux中,find命令用于在指定目录下搜索文件和目录,并根据指定的条件进行匹配。我认为是最常用的查找文件工具之一了,另外的文件查找工具locate
、whereis
、which
后面会专门介绍一下,在日常工作中个人觉得也没有find用得多。
语法格式如下:
find [path] [options] [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个逻辑去学习,匹配条件就是找到匹配的文件列表,处理方法就是 找到了文件之后 做一些什么样的处理操作。
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的文件
#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=createmtime
) m=modifyatime
) a=access文件的分钟单位和时间戳类似 也分为了cmin、mmin、amin 分别对应 创建时间分钟数、修改时间分钟数、访问时间分钟数。
同样的和size类似 数值前可以加 +/-号来表示不同的含义
多条件就是在查找文件的同时用多个条件去查找支持and、not 、or
如下表示查询/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 \;
常用的后置处理动作参数: