点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!日常工作中我们总会面临各类文件检索需求:大日志定位、特定权限文件排查、过期文件清理、批量文件操作等.而在众多检索工具中,find命令无疑是最强大、最灵活的。能精准匹配文件属性、大小、时间、权限等多种条件,既能快速定位单个文件,也能批量处理符合条件的文件集合,是运维工程师必备的核心技能之一。find命令从指定的起始目录开始,递归遍历其所有子目录,对每个文件和目录进行条件匹配,将符合条件的结果输出,检索的是文件系统当前状态。find命令的语法结构:find [路径] [匹配条件] [动作指令] | | | | |
| 指定目录(如/etc、/var/log)、.(当前目录)、/(根目录) | | 常用路径:/etc、/var/log等,避免直接从/检索,提升效率 | |
| | | 高用于定位日志、配置文件,示例:find /var/log -type f -iname "*.log"(/var/log下所有.log文件,不区分大小写) | |
| | | 优先指定类型,避免误匹配,示例:find /etc -type d -name "nginx*"(/etc下所有nginx开头目录) |
| | | 排查大文件、清理过期大日志,示例:find /var -type f -size +100M(/var下大于100MB普通文件) |
| | | 常用-mtime +3(3天前修改),清理过期文件,示例:find /var/log -type f -name "*.log" -mtime +3(/var/log下3天前修改的.log文件) |
| | | 排查高危权限(如777)文件,示例:find / -type f -perm 777 2>/dev/null(/下权限777的普通文件,屏蔽错误提示) |
| | | 清理离职用户文件、排查服务文件归属,示例:find /home -user test(/home下所有者为test的文件) |
| | | | |
| | | |
| | | |
| | | |
日常运维中,单一条件检索往往无法满足需求,find命令支持通过逻辑运算符组合多个条件,实现更精准的筛选;同时支持按权限、所有者等属性匹配,覆盖更复杂的场景。- 逻辑非,匹配不满足该条件的文件(注意:!在bash中需要转义,即\!);
- 逻辑与,匹配同时满足两个条件的文件(默认组合方式,可省略);
# 检索/var/log目录下,大于50MB、且3天前修改过的.log文件(清理大旧日志)find /var/log -typef -name "*.log" -size +50M -a -mtime +3# 检索/etc目录下,不是nginx开头、且是.conf结尾的配置文件(排除nginx相关配置)find /etc -typef -not -name "nginx*.conf" -name "*.conf"# 检索/home目录下,所有者是root,或大小大于100MB的文件(排查异常文件)find /home -typef -user root -o -size +100M
- -perm 权限值,支持两种权限表示方式:数字权限(如755、644)、符号权限(如u=rwx)。
- 排查权限过宽的文件(如777权限的系统文件)、权限不足的服务配置文件。
# 检索系统根目录下,权限为777的普通文件(高危权限,需及时修改)find / -type f -perm 7772>/dev/null # 2>/dev/null屏蔽权限不足的错误提示# 检索/etc目录下,所有者有读、写权限,其他用户无任何权限的配置文件find /etc -type f -perm u=rw,o=-# 检索/var/www目录下,权限包含执行权限(任意用户)的文件find /var/www -type f -perm /111
- -user 用户名(匹配所有者为指定用户的文件)、-group 组名(匹配所属组为指定组的文件)。
- 清理离职用户的文件、排查某服务用户(如nginx、mysql)所属的文件。
# 检索/home目录下,所有者为离职用户test的所有文件find /home -user test# 检索/var/lib目录下,所属组为mysql的文件find /var/lib -group mysql# 检索/root目录下,既不是root所有者,也不是root所属组的文件(排查异常文件)find /root -not -user root -a -not -group root
find命令的强大之处,不仅在于“找到”文件,更在于能对找到的文件批量执行动作,无需手动逐个操作,极大提升运维效率。常用动作指令如下,重点掌握-exec和-delete。- -delete(直接删除匹配到的文件/目录,注意:删除目录需确保目录为空;优先使用-test测试,避免误删)。
- 删除前,先用-print查看匹配结果,确认无误后再替换为-delete;或使用-exec rm -rf {} \;
# 第一步:测试,查看要删除的文件(/var/log下7天前的.log文件)find /var/log -type f -name "*.log" -mtime +7 -print# 第二步:确认无误后,批量删除(直接删除,无确认)find /var/log -type f -name "*.log" -mtime +7 -delete# 更安全的方式:批量删除前提示确认(每删除一个文件需确认)find /var/log -type f -name "*.log" -mtime +7 -exec rm -i {} \;# 批量删除空目录(/tmp下7天未访问的空目录)find /tmp -type d -atime +7 -empty -delete
- -exec 命令 {} \;,其中{} 代表匹配到的每个文件路径,\; 是结束标记(必须添加,区分多个命令);若需要将多个文件作为参数传递给命令,可使用-exec 命令 {} +(效率更高,避免多次执行命令)。
- 批量复制、移动文件,批量修改权限,批量压缩日志,批量查看文件信息等。
# 批量将/var/log下7天前的.log文件,复制到/backup/log目录(备份旧日志)find /var/log -type f -name "*.log" -mtime +7 -exec cp {} /backup/log/ \;# 批量修改/home/test目录下所有.conf文件的权限为755find /home/test -type f -name "*.conf" -exec chmod 755 {} \;# 批量压缩/var/log下大于100MB的.log文件(用gzip压缩,保留原文件)find /var/log -type f -name "*.log" -size +100M -exec gzip {} \;# 批量查看匹配文件的详细信息(替代ls -l,精准查看找到的文件)find /etc -type f -name "*.conf" -exec ls -l {} \; v
- 与-print类似,但输出时用空字符分隔文件路径,避免文件名包含空格、特殊字符导致的误处理(配合xargs使用,);
- 直接打印匹配文件的详细信息(等同于ls -l,简化命令);
- 与-exec类似,但执行每个命令前都会提示确认(更安全,适合重要操作)。
# 检索/root目录下,文件名包含空格的文件,并批量移动到/root/space目录find /root -typef -name "* *" -print0 | xargs -0 -I {} mv {} /root/space/