Featured image of post Linux命令-find

Linux命令-find

find 命令速查

Linux命令-find

0x00 TL;DR (太长不看版):一分钟速通

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
TEXT
+-------------------------------------------------------------+
|   find 核心语法公式:在哪找? -> 找什么? -> 找到后干嘛?   |
+-------------------------------------------------------------+
   find     <PATH>        <CONDITIONS>         <ACTIONS>
    |         |                |                   |
    v         v                v                   v
  命令     . (当前目录)     -name "*.log"       -delete (直接删除)
           / (根目录)       -size +1G           -exec ls -l {} + (执行命令)
           /var/log       -mtime -7           -print (默认打印)

高频操作

  1. 找文件 (按名字/后缀)
1
2
3
4
5
# 忽略大小写,找当前目录及子目录包含 config 的文件
find . -iname "*config*"

# 找所有的 .py 和 .go 代码文件
find . -type f \( -name "*.py" -o -name "*.go" \)
  1. 查容量 (排查磁盘打满)
1
2
   # 全局查找大于 500MB 的文件,并屏蔽权限报错 (2>/dev/null)
find / -type f -size +500M 2>/dev/null
  1. 查时间 (排查被黑/最近改动)
1
2
   # 查找 /etc 下最近 24 小时内被修改过的文件
find /etc -type f -mtime -1
  1. 批量操作 (自动化运维/清理)
1
2
3
4
5
6
   # 清理 30 天前的旧日志文件 (极速模式)
find /var/log -name "*.log" -mtime +30 -delete

# 批量修复 Web 目录权限 (目录 755,文件 644)
find /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +

核心避坑口诀

  • 找文件必须加 -type f,否则目录也会匹配上。
  • 通配符必须加双引号(如 "*log"),防止被 Shell 提前解析。
  • 批量执行命令时,结尾用 + 比用 \; 性能高百倍(类似 xargs 机制)。

0x01 抄起就用:高频过滤参数速查表

1. 按类型与名称 (Type & Name)

参数含义示例 / 备注
-type f仅查找普通文件 (File)find . -type f (最常用,过滤掉目录)
-type d仅查找目录 (Dir)find . -type d
-type l仅查找软链接 (Link)find . -type l
-name按文件名精确/通配匹配-name “*.conf” (严格区分大小写)
-iname按文件名忽略大小写-iname “readme.txt” (匹配 README.txt)

2. 按文件大小 (Size)

单位速记c (Bytes), k (KB), M (MB), G (GB)。注意区分大小写!

参数含义示例 / 备注
-size +nM大于 n MB-size +500M (找大文件排查磁盘)
-size -nK小于 n KB-size -10k
-size nG精确等于 n GB-size 1G (极少用精确匹配)
-empty查找空文件/空目录find . -type f -empty

3. 按时间戳 (Time)

时间轴逻辑+n = n天前 (更老);-n = n天内 (更新);n = 正好第n天。

参数含义 (以天为单位)示例 / 备注
-mtime修改时间 (内容变更)-mtime -7 (最近7天内被修改过的文件)
-atime访问时间 (被读取过)-atime +30 (30天没被碰过的冷数据)
-ctime改变时间 (权限/属性)-ctime -1 (最近24小时内权限被改过)
-mmin分钟级修改时间-mmin -60 (最近1小时内修改,应急排查用)

4. 按权限与归属 (Permission & Owner) - Security Ops 常用

参数含义示例 / 备注
-user属主匹配-user www-data (找 Web 服务创建的文件)
-group属组匹配-group docker
-perm权限精确匹配-perm 777 (找高危全开权限文件)
-perm -n权限包含匹配-perm -4000 (找 SUID 提权后门文件)
-nouser无主文件 (孤儿文件)离职员工删号后遗留,黑客隐藏常用

5. 多条件组合逻辑 (AND / OR / NOT)

默认多个参数连写就是 AND (与) 的关系。

  • AND (默认): find . -type f -name "*.log" (是文件 后缀是 .log)
  • OR (-o): find . -type f \( -name "*.jpg" -o -name "*.png" \) (找 jpg png,注意括号要转义 \( )
  • NOT (!): find . -type f ! -name "*.tmp" (找所有文件,排除 .tmp 后缀)

0x02 实战演练:批量操作 (-exec 与 -delete 自动化)

核心思维find 的真正威力在于 “找到即执行”,实现自动化运维。

场景 1:批量文件操作

痛点:手动对每个文件执行相同操作。

1
2
3
4
5
6
7
8
# 1. 批量重命名(给所有 .txt 文件添加 .bak 后缀)
find . -name "*.txt" -exec mv {} {}.bak \;

# 2. 批量转换编码(GBK → UTF-8)
find . -name "*.java" -exec iconv -f GBK -t UTF-8 {} -o {}.utf8 \;

# 3. 批量计算 MD5(安全审计)
find /etc -type f -exec md5sum {} \; > etc_files.md5

场景 2:自动化清理

痛点:磁盘空间告警,需快速定位并清理垃圾文件。

1
2
3
4
5
6
7
8
9
# 1. 清理所有临时文件(安全模式:先打印,确认后删除)
find /tmp -name "*.tmp" -type f -mtime +7  # 先查看
find /tmp -name "*.tmp" -type f -mtime +7 -delete  # 确认后执行

# 2. 删除所有空目录(递归清理)
find . -type d -empty -delete

# 3. 清理 Docker 残留(容器日志/缓存)
find /var/lib/docker -name "*.log" -size +100M -exec truncate -s 0 {} \;

场景 3:安全应急响应

痛点:服务器被入侵后,快速排查异常。

1
2
3
4
5
6
7
8
9
# 1. 查找 24 小时内新增/修改的可执行文件(提权后门)
find / -type f -perm /111 -mtime -1 2>/dev/null | head -20

# 2. 查找 Web 目录下的 webshell(PHP/Ruby/Python)
find /var/www -type f \( -name "*.php" -o -name "*.rb" -o -name "*.py" \) \
  -exec grep -l "eval\|base64_decode\|shell_exec" {} \; 2>/dev/null

# 3. 查找 SUID 特权文件(提权利用)
find / -type f -perm -4000 -ls 2>/dev/null

性能优化:-exec 的两种模式

1
2
3
4
5
6
+----------------+----------------+------------------------------+
| 模式           | 语法           | 执行逻辑                     |
+----------------+----------------+------------------------------+
| 逐个执行       | -exec cmd {} \;| 每找到一个文件,执行一次命令 |
| 批量执行       | -exec cmd {} + | 一次性传递所有文件,执行一次 |
+----------------+----------------+------------------------------+

性能对比测试

1
2
3
4
5
6
7
8
# 创建 1000 个测试文件
for i in {1..1000}; do touch /tmp/test_$i.txt; done

# 逐个执行(慢!启动 1000 次进程)
time find /tmp -name "test_*.txt" -exec ls -l {} \;

# 批量执行(快!只启动 1 次进程)
time find /tmp -name "test_*.txt" -exec ls -l {} +

实战选择

  • 需要操作结果(如 -exec mv {} {}.bak \;)→ 用 \;
  • 统计/批量处理(如 -exec chmod 644 {} +)→ 用 +

0x03 避坑指南:性能优化与高级技巧

错误 1:忘记处理权限错误

1
2
3
4
5
6
7
8
# ❌ 新手写法(满屏 Permission denied)
find / -name "*.conf"

# ✅ 专业写法(屏蔽所有 stderr 错误)
find / -name "*.conf" 2>/dev/null

# ✅ 运维写法(只屏蔽权限错误,保留其他错误)
find / -name "*.conf" 2>&1 | grep -v "Permission denied"

错误 2:递归遍历导致卡死

问题find /procfind /sys 会陷入死循环。

1
2
3
4
5
6
7
8
9
# ❌ 危险!可能卡死系统
find /proc -name "*"

# ✅ 跳过特殊文件系统
find / -path /proc -prune -o -name "*.conf" -print
# 含义:如果路径是 /proc 就剪枝(跳过),否则执行查找

# ✅ 通用模板:跳过多个目录
find / \( -path /proc -o -path /sys -o -path /dev \) -prune -o -name "*.conf" -print

高级技巧 1:配合 xargs 提升百倍性能

原理xargs 可将标准输入转为命令行参数,减少进程启动次数。

1
2
3
4
5
6
7
8
# 传统 -exec(启动 1000 次 rm 进程)
find . -name "*.tmp" -exec rm {} \;

# xargs 优化(1-10 次 rm 进程)
find . -name "*.tmp" -print0 | xargs -0 rm -f

# 带并行加速(4 进程并发删除)
find . -name "*.tmp" -print0 | xargs -0 -P4 rm -f

高级技巧 2:统计与报告

1
2
3
4
5
6
7
8
# 统计当前目录下各类型文件数量
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort | uniq -c | sort -rn

# 生成磁盘使用报告(大文件 Top10)
find / -type f -size +100M 2>/dev/null -exec du -h {} + | sort -rh | head -10

# 查找重复文件(按 MD5)
find . -type f -exec md5sum {} + | sort | uniq -Dw32

终极总结:find 思维模型

  1. 路径思维:明确搜索起点(.//var/log)。
  2. 过滤思维:按需组合条件(类型、名称、时间、大小、权限)。
  3. 行动思维:找到后要做什么(打印、删除、执行命令)。
  4. 性能思维:屏蔽错误、跳过目录、批量执行。
  5. 安全思维:小心 -delete,先用 -print 确认。

一句话公式

1
find <在哪找> <找什么> <找到后干嘛>

立刻上手:复制下方命令到终端,体验完整流程。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 创建测试环境
mkdir -p /tmp/find_demo && cd /tmp/find_demo
touch {1..3}.txt {1..3}.log
mkdir -p subdir && touch subdir/4.txt

# 练习:找出所有 .txt 文件并显示详情
find . -name "*.txt" -exec ls -lh {} \;

# 清理
cd && rm -rf /tmp/find_demo

参考

使用 Hugo 构建
主题 StackJimmy 设计