find基础语法
进阶用法
-not 或 ! 逻辑非,匹配不满足该条件的文件(注意:!在bash中需要转义,即\!); -a 或 空格 逻辑与,匹配同时满足两个条件的文件(默认组合方式,可省略); -o 逻辑或,匹配满足任意一个条件的文件。
# 检索/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
批量处理
语法 -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文件的权限为755
find /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
-print0 与-print类似,但输出时用空字符分隔文件路径,避免文件名包含空格、特殊字符导致的误处理(配合xargs使用,); -ls 直接打印匹配文件的详细信息(等同于ls -l,简化命令); -ok 与-exec类似,但执行每个命令前都会提示确认(更安全,适合重要操作)。
# 检索/root目录下,文件名包含空格的文件,并批量移动到/root/space目录
find /root -typef -name "* *" -print0 | xargs -0 -I {} mv {} /root/space/

本文作者:李易明(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




