当前位置:首页>Linux>终于有人把Linux系统 find命令 高级用法讲透了

终于有人把Linux系统 find命令 高级用法讲透了

  • 2026-10-10 12:07:58
终于有人把Linux系统 find命令 高级用法讲透了

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"

四、多条件逻辑组合

  • • -a AND(默认,可省略)
  • • -o OR
  • • ! 取反
# 匹配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

五、运维高频实战场景

  1. 1. 磁盘清理:批量删除过期日志
find /usr/local/tomcat/logs -type f -name "*.log" -mtime +7 -print0 | xargs -0 rm -f
  1. 2. 安全巡检:全网777权限文件
find / -type f -perm 0777 2>/dev/null
  1. 3. 统计大文件,定位磁盘爆满
find / -type f -size +500M -printf "%s %p\n" 2>/dev/null | sort -nr
  1. 4. 批量查找替换配置文件内容
find . -name "*.properties" -print0 | xargs -0 sed -i 's/127.0.0.1/192.168.1.100/g'
  1. 5. 过滤隐藏目录,检索业务代码
find . \( -path "./.git" -o -path "./node_modules" \) -prune -o -name "*.java" -print

六、避坑关键点

  1. 1. 根目录/搜索加 2>/dev/null 屏蔽权限拒绝报错;
  2. 2. 文件名含空格、中文、括号必须用 -print0 | xargs -0;
  3. 3. 删除操作先去掉 -delete/-exec rm,打印文件确认再执行;
  4. 4. -prune 放在 -o 前,才能真正排除目录;
  5. 5. -exec {} + 比 \; 性能更强,批量操作优先使用。

最新文章

随机文章