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
2
3
4
5
| # 忽略大小写,找当前目录及子目录包含 config 的文件
find . -iname "*config*"
# 找所有的 .py 和 .go 代码文件
find . -type f \( -name "*.py" -o -name "*.go" \)
|
- 查容量 (排查磁盘打满)
1
2
| # 全局查找大于 500MB 的文件,并屏蔽权限报错 (2>/dev/null)
find / -type f -size +500M 2>/dev/null
|
- 查时间 (排查被黑/最近改动)
1
2
| # 查找 /etc 下最近 24 小时内被修改过的文件
find /etc -type f -mtime -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 /proc 或 find /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 思维模型
- 路径思维:明确搜索起点(
.、/、/var/log)。 - 过滤思维:按需组合条件(类型、名称、时间、大小、权限)。
- 行动思维:找到后要做什么(打印、删除、执行命令)。
- 性能思维:屏蔽错误、跳过目录、批量执行。
- 安全思维:小心
-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
|
参考