# Linux命令-find寻找所有文件！
<!--more-->

# Linux命令-find

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

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

```

高频操作
1. **找文件 (按名字/后缀)**
```bash
# 忽略大小写，找当前目录及子目录包含 config 的文件
find . -iname "*config*"

# 找所有的 .py 和 .go 代码文件
find . -type f \( -name "*.py" -o -name "*.go" \)
```
2. **查容量 (排查磁盘打满)**
```bash
   # 全局查找大于 500MB 的文件，并屏蔽权限报错 (2>/dev/null)
find / -type f -size +500M 2>/dev/null

```
3. **查时间 (排查被黑/最近改动)**
```bash
   # 查找 /etc 下最近 24 小时内被修改过的文件
find /etc -type f -mtime -1

```
4. **批量操作 (自动化运维/清理)**
```bash
   # 清理 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：批量文件操作

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

```bash
# 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：自动化清理

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

```bash
# 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：安全应急响应

**痛点**：服务器被入侵后，快速排查异常。

```bash
# 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 的两种模式

```text
+----------------+----------------+------------------------------+
| 模式           | 语法           | 执行逻辑                     |
+----------------+----------------+------------------------------+
| 逐个执行       | -exec cmd {} \;| 每找到一个文件，执行一次命令 |
| 批量执行       | -exec cmd {} + | 一次性传递所有文件，执行一次 |
+----------------+----------------+------------------------------+
```

**性能对比测试**：
```bash
# 创建 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：忘记处理权限错误

```bash
# ❌ 新手写法（满屏 Permission denied）
find / -name "*.conf"

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

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

### 错误 2：递归遍历导致卡死

**问题**：`find /proc` 或 `find /sys` 会陷入死循环。

```bash
# ❌ 危险！可能卡死系统
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` 可将标准输入转为命令行参数，减少进程启动次数。

```bash
# 传统 -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：统计与报告

```bash
# 统计当前目录下各类型文件数量
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` 确认。

**一句话公式**：
```bash
find <在哪找> <找什么> <找到后干嘛>
```

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

```bash
# 创建测试环境
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
```

## 参考
- [菜鸟教程 Linux find 命令](https://www.runoob.com/linux/linux-comm-find.html)
- [封面](https://www.mylittlewallpaper.com/c/vocaloid/download/61ea194382edc1.04314421)


