Linux find 命令高级用法全总结
一、基础语法
find [搜索路径] [匹配条件] [执行动作]
核心逻辑:遍历目录树,按条件筛选文件,再对结果执行操作。
二、常用高级筛选条件
1. 按时间筛选(运维日志清理高频)
单位:min 分钟、time 天;a访问、m内容修改、c属性变更
# 1. 7天前修改的日志(删除过期日志)
find /var/log -type f -mtime +7
# 2. 240分钟内访问过的文件
find /tmp -atime -240
# 3. 恰好30分钟前修改
find . -mmin 30
# 4. 对比:-newer 比指定文件更新
find . -type f -newer test.log
2. 按文件大小筛选
单位:c字节、kKB、MMB、GGB
# 大于100M的文件,排查磁盘占用
find /data -type f -size +100M
# 小于10k的空小文件
find . -size -10k
# 等于500字节
find . -size 500c
3. 按权限、属主、属组
# 全局查找777权限危险文件
find / -type f -perm 0777
# 包含w权限(任意用户可写)
find . -perm /222
# 查找root拥有的文件
find /home -user root
# 查找组为nginx的日志
find /var/log/nginx -group nginx
# 无属主/无属组(磁盘迁移残留文件)
find . -nouser -o -nogroup
4. 按名称、后缀、正则匹配
# 通配符匹配日志,-name区分大小写;-iname忽略大小写
find . -iname "*.log"
# 排除目录匹配
find /data -type f -name "backup_*.tar.gz"
# 正则高级匹配(匹配数字结尾txt)
find . -regex ".*/[0-9]+\.txt"
# 排除指定目录(过滤node_modules、git)
find . -path "./node_modules" -prune -o -name "*.js" -print
5. 按文件类型
f普通文件、d目录、l软链、s套接字、b/c设备
# 只找目录
find . -type d
# 只找软链接
find /etc -type l
# 查找空文件/空目录
find . -type f -empty
find . -type d -empty
三、核心高级执行动作(重点)
1. -print0 + xargs -0 解决文件名含空格/特殊字符(生产必备)
普通管道 |xargs 遇空格文件名会拆分报错,-print0 用null分隔:
# 批量删除带空格的过期日志
find . -name "*.log" -mtime +3 -print0 | xargs -0 rm -f
# 批量替换文件内容
find . -name "*.conf" -print0 | xargs -0 sed -i 's/old/new/g'
2. -exec 直接执行命令
两种写法:{} 代表匹配到的文件,\; 结束;+ 合并参数减少进程
# 写法1:逐个执行(适合单文件操作)
find . -type f -name "*.tmp" -exec rm {} \;
# 写法2:合并批量执行,性能更高(推荐)
find /var/log -mtime +15 -type f -exec rm {} +
# 批量修改文件权限
find . -type f -exec chmod 644 {} +
find . -type d -exec chmod 755 {} +
# 复制匹配文件到备份目录
find . -name "*.csv" -exec cp {} /data/backup \;
3. -delete 快速删除(简化版-exec rm)
# 删除7天前日志,慎用!先去掉-delete打印确认
find /var/log/app -name "*.log" -mtime +7 -delete
# 删除空目录
find . -type d -empty -delete
4. -ls / -printf 自定义输出格式
# 类ls长格式展示文件
find . -name "*.tar" -ls
# 自定义输出:权限 大小 修改时间 路径
find . -type f -printf "%m %8s %TY-%Tm-%Td %p\n"
# 只输出文件名,不带路径
find /data -type f -printf "%f\n"
四、多条件逻辑组合
# 匹配log或txt文件
find . -name "*.log" -o -name "*.txt"
# 不是git目录的文件
find . ! -path "*/.git/*" -type f
# 大于100M 且 30天前的压缩包
find /backup -type f -name "*.gz" -size +100M -a -mtime +30
五、运维高频实战场景
find /usr/local/tomcat/logs -type f -name "*.log" -mtime +7 -print0 | xargs -0 rm -f
find / -type f -perm 0777 2>/dev/null
find / -type f -size +500M -printf "%s %p\n" 2>/dev/null | sort -nr
find . -name "*.properties" -print0 | xargs -0 sed -i 's/127.0.0.1/192.168.1.100/g'
find . \( -path "./.git" -o -path "./node_modules" \) -prune -o -name "*.java" -print
六、避坑关键点
- 1. 根目录
/搜索加 2>/dev/null 屏蔽权限拒绝报错; - 2. 文件名含空格、中文、括号必须用
-print0 | xargs -0; - 3. 删除操作先去掉
-delete/-exec rm,打印文件确认再执行; - 4.
-prune 放在 -o 前,才能真正排除目录; - 5.
-exec {} + 比 \; 性能更强,批量操作优先使用。