🔍 强大的文件搜索工具 - Linux 文件查找之王
目录
- 简介
- 基础语法
- 按名称搜索
- 按类型搜索
- 按大小搜索
- 按时间搜索
- 按权限与用户搜索
- 按内容搜索
- 操作与动作
- 逻辑组合
- 实战示例
- 技巧与最佳实践
一、简介
1.1 什么是 find
find 是 Linux/Unix 中最强大的文件搜索工具,可以根据文件名、类型、大小、时间、权限等多种条件查找文件,并对结果执行操作。
核心特点:
- 支持多条件组合搜索
- 支持正则表达式
- 可对结果执行命令
- 递归搜索目录
- 支持逻辑运算(AND/OR/NOT)
二、基础语法
2.1 命令格式
find [搜索路径] [选项] [表达式] [动作]
2.2 常用选项
| 选项 |
说明 |
-name |
按文件名(支持通配符) |
-iname |
按文件名(忽略大小写) |
-type |
按类型 |
-size |
按大小 |
-mtime |
按修改时间(天) |
-atime |
按访问时间(天) |
-ctime |
按创建时间(天) |
-mmin |
按修改时间(分钟) |
-amin |
按访问时间(分钟) |
-cmin |
按创建时间(分钟) |
-perm |
按权限 |
-user |
按用户 |
-group |
按用户组 |
-empty |
空文件/目录 |
-path |
按路径匹配 |
-regex |
正则匹配 |
-maxdepth |
最大搜索深度 |
-mindepth |
最小搜索深度 |
-prune |
排除目录 |
-exec |
对结果执行命令 |
-ok |
执行前确认 |
-delete |
删除匹配文件 |
-print |
打印路径(默认) |
-ls |
详细列表 |
! / -not |
取反 |
-a / -and |
与(默认) |
-o / -or |
或 |
三、按名称搜索
3.1 精确与通配符
# 按名称搜索(区分大小写)
find / -name "nginx.conf"
find . -name "*.txt"
find . -name "file?.log"
find . -name "[abc]*.txt"# 忽略大小写
find . -iname "README*"
find . -iname "*.JPG"
find . -iname "*.Mp3"# 搜索路径匹配
find . -path "*/src/*.java"
find . -path "*/test/*"
find . -path "./node_modules/*" -prune -o -name "*.js" -print# 正则表达式
find . -regex ".*\.\(py\|java\|js\)$"
find . -regex ".*test.*\.py$"
find . -iregex ".*\.jpg$" # 忽略大小写
3.2 多名称搜索
# 使用 -o(或)
find . \( -name "*.jpg" -o -name "*.png" -o -name "*.gif" \)# 使用 -regex
find . -regex ".*\.\(jpg\|png\|gif\)"# 排除特定名称
find . -name "*.log" ! -name "error*"
find . ! -name "*.tmp" -type f
四、按类型搜索
4.1 文件类型
| 类型 |
说明 |
f |
普通文件 |
d |
目录 |
l |
符号链接 |
b |
块设备 |
c |
字符设备 |
p |
管道 |
s |
套接字 |
4.2 示例
# 只搜索文件
find . -type f# 只搜索目录
find . -type d# 搜索符号链接
find . -type l# 搜索所有 .py 文件
find . -type f -name "*.py"# 搜索空目录
find . -type d -empty# 搜索空文件
find . -type f -empty# 统计文件数
find . -type f | wc -l# 统计目录数
find . -type d | wc -l
五、按大小搜索
5.1 大小单位
| 后缀 |
说明 |
c |
字节 |
k |
KB |
M |
MB |
G |
GB |
b |
512 字节块 |
w |
双字(2 字节) |
5.2 大小比较
| 格式 |
说明 |
-size N |
等于 N |
-size +N |
大于 N |
-size -N |
小于 N |
5.3 示例
# 精确大小
find . -size 100c # 恰好 100 字节
find . -size 10k # 恰好 10KB# 大于
find . -size +100M # 大于 100MB
find . -size +1G # 大于 1GB# 小于
find . -size -1k # 小于 1KB
find . -size -100M # 小于 100MB# 范围
find . -size +10M -size -100M # 10MB ~ 100MB
find . -size +1k -size -10k # 1KB ~ 10KB# 实用场景
find / -type f -size +500M -exec ls -lh {} \; # 大文件
find . -type f -size 0 # 空文件
find /var/log -type f -size +100M # 大日志文件
六、按时间搜索
6.1 时间类型
| 选项 |
说明 |
-mtime N |
修改时间(天) |
-atime N |
访问时间(天) |
-ctime N |
元数据变更时间(天) |
-mmin N |
修改时间(分钟) |
-amin N |
访问时间(分钟) |
-cmin N |
元数据变更时间(分钟) |
-newer FILE |
比文件更新 |
-anewer FILE |
比文件访问时间更新 |
-cnewer FILE |
比文件变更时间更新 |
6.2 时间比较
| 格式 |
说明 |
-mtime N |
恰好 N 天前 |
-mtime +N |
超过 N 天 |
-mtime -N |
N 天以内 |
6.3 示例
# 按天
find . -mtime -1 # 1 天内修改
find . -mtime -7 # 7 天内修改
find . -mtime +30 # 30 天前修改
find . -mtime +30 -mtime -60 # 30~60 天前# 按分钟
find . -mmin -10 # 10 分钟内修改
find . -mmin -60 # 1 小时内修改
find . -amin -60 # 1 小时内访问
find . -cmin -30 # 30 分钟内变更# 比较文件
find . -newer reference.txt # 比 reference.txt 更新
find . -newermt "2024-01-01" # 2024-01-01 之后修改
find . -newermt "2024-01-01" ! -newermt "2024-06-01" # 日期范围# 实用场景
find /tmp -type f -mtime +7 -delete # 删除 7 天前的临时文件
find /var/log -name "*.log" -mtime +30 # 30 天前的日志
find . -type f -mmin -60 -name "*.py" # 1 小时内修改的 Python 文件
七、按权限与用户搜索
7.1 按权限
# 精确权限
find . -perm 755
find . -perm 644
find . -perm 777# 包含权限(至少有这些权限)
find . -perm -u+x # 用户可执行
find . -perm -o+w # 其他用户可写
find . -perm -4000 # SUID
find . -perm -2000 # SGID
find . -perm -1000 # Sticky bit# 任意匹配
find . -perm /u+x # 用户可执行(任意匹配)
find . -perm /777 # 任一权限位匹配# 实用场景
find / -perm -4000 -type f # 查找 SUID 文件
find / -perm -2000 -type f # 查找 SGID 文件
find . -perm 777 -type f # 查找完全开放权限的文件
find / -writable -type f # 全局可写文件
7.2 按用户和组
# 按用户
find . -user root
find . -user www-data
find . -user mysql# 按组
find . -group docker
find . -group sudo# 查找无主文件
find / -nouser
find / -nogroup# 查找特定用户的文件
find /home -user john -type f# 组合
find . -user root -perm -4000 # root 的 SUID 文件
八、按内容搜索
# 查找包含特定文本的文件
find . -type f -name "*.py" -exec grep -l "import os" {} \;# 查找包含特定文本(忽略大小写)
find . -type f -exec grep -il "TODO" {} \;# 查找包含多个关键词的文件
find . -type f -name "*.java" -exec grep -l "SQLException" {} \;# 查找包含 IP 地址的文件
find . -type f -exec grep -l "192\.168\.1\." {} \;# 查找包含密码的文件(安全检查)
find . -type f \( -name "*.yml" -o -name "*.yaml" -o -name "*.env" -o -name "*.conf" \) \-exec grep -il "password\|secret\|token" {} \;# 统计代码行数
find . -name "*.py" -type f -exec wc -l {} + | tail -1# 查找 TODO 和 FIXME
find . -type f \( -name "*.py" -o -name "*.js" -o -name "*.java" \) \-exec grep -in "TODO\|FIXME" {} +
九、操作与动作
9.1 -exec 执行命令
# 基本格式
find . -name "*.log" -exec command {} \;# 列出文件详情
find . -name "*.conf" -exec ls -la {} \;# 删除文件
find . -name "*.tmp" -exec rm {} \;
find . -name "*.log" -exec rm -f {} \;# 复制文件
find . -name "*.jpg" -exec cp {} /backup/ \;# 移动文件
find . -name "*.old" -exec mv {} /archive/ \;# 更改权限
find . -type f -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;# 更改用户
find . -type f -user old -exec chown new {} \;# 压缩文件
find . -name "*.log" -exec gzip {} \;# 批量执行(+ 号更高效)
find . -name "*.log" -exec rm {} + # 比 \; 更快
find . -type f -exec ls -la {} +
find . -name "*.py" -exec grep "import" {} +
9.2 -ok 确认执行
# 每个文件都确认
find . -name "*.tmp" -ok rm {} \;
# < rm ... /path/to/file.tmp > ? y
9.3 -delete 删除
# 删除匹配文件(比 -exec rm 更安全)
find . -name "*.tmp" -delete
find . -type f -empty -delete
find /tmp -type f -mtime +7 -delete
9.4 -ls 详细列表
find . -name "*.conf" -ls
# 输出类似 ls -dils
9.5 -printf 自定义输出
# 只显示文件名
find . -name "*.py" -printf "%f\n"# 显示大小和路径
find . -name "*.log" -printf "%s %p\n"# 显示修改时间和路径
find . -type f -printf "%TY-%Tm-%Td %TH:%TM %p\n"# CSV 格式
find . -type f -printf "%p,%s,%TY-%Tm-%Td\n"# 完整信息
find . -type f -printf "%p\t%sk\t%TY-%Tm-%Td %TH:%TM\n"
十、逻辑组合
10.1 AND(默认)
# 多条件同时满足(AND 是默认的)
find . -name "*.py" -type f
find . -name "*.log" -size +10M
find . -type f -mtime -7 -name "*.java"
10.2 OR
# 多个条件任一满足
find . \( -name "*.jpg" -o -name "*.png" -o -name "*.gif" \)
find . \( -name "*.py" -o -name "*.pyc" \) -type f
find . -type f \( -name "*.log" -o -name "*.tmp" \)
10.3 NOT
# 排除条件
find . ! -name "*.pyc"
find . -type f ! -name "*.log"
find . ! -path "*/node_modules/*" -name "*.js"
find . ! -path "*/.git/*" -type f
10.4 组合
# 复杂条件
find . -type f \( -name "*.py" -o -name "*.js" \) ! -path "*/venv/*" ! -path "*/node_modules/*"# 排除多个目录
find . \( -name .git -o -name node_modules -o -name __pycache__ \) -prune -o -type f -name "*.py" -print# 条件组合
find . -type f \( -name "*.conf" -o -name "*.yaml" \) -size +0 -mtime -7
十一、实战示例
11.1 清理临时文件
# 删除 7 天前的日志
find /var/log -name "*.log" -mtime +7 -delete# 删除空文件
find . -type f -empty -delete# 删除空目录
find . -type d -empty -delete# 删除特定后缀的临时文件
find /tmp -type f \( -name "*.tmp" -o -name "*.bak" -o -name "*.swp" \) -delete# 清理旧备份
find /backup -name "*.tar.gz" -mtime +30 -delete
11.2 查找大文件
# 当前目录最大的 10 个文件
find . -type f -exec ls -lh {} + | sort -k5 -hr | head -10# 超过 100MB 的文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null# 超过 1GB 的文件
find / -type f -size +1G 2>/dev/null# 按大小排序
find . -type f -printf "%s %p\n" | sort -rn | head -20
11.3 查找最近修改的文件
# 1 小时内修改的文件
find . -type f -mmin -60# 今天修改的文件
find . -type f -mtime -1# 最近 10 分钟修改的 Python 文件
find . -name "*.py" -type f -mmin -10# 比某个文件更新的文件
find . -type f -newer main.py
11.4 代码项目搜索
# 统计代码行数
find . -name "*.py" -not -path "*/venv/*" -not -path "*/__pycache__/*" | xargs wc -l | tail -1# 查找所有 Python 文件(排除虚拟环境)
find . -name "*.py" -not -path "*/venv/*" -not -path "*/.venv/*"# 查找未使用的导入
find . -name "*.py" -exec grep -l "^import" {} \; | while read f; domodule=$(grep "^import " "$f" | awk '{print $2}')for m in $module; doif ! grep -rq "$m" "$f" | grep -v "^import"; thenecho "$f: unused import $m"fidone
done# 查找硬编码的密钥
find . -type f \( -name "*.py" -o -name "*.js" -o -name "*.env" \) \-exec grep -il "api_key\|secret\|password\s*=" {} \; \-not -path "*/node_modules/*" -not -path "*/.git/*"
11.5 系统管理
# SUID 文件(安全检查)
find / -perm -4000 -type f 2>/dev/null# 全局可写文件
find / -perm -o+w -type f 2>/dev/null# 无主文件
find / -nouser -o -nogroup 2>/dev/null# 最近修改的配置文件
find /etc -type f -mtime -1# 查找所有日志文件
find /var/log -type f -name "*.log"# 查找所有 cron 任务文件
find /etc/cron* -type f
find /var/spool/cron -type f
11.6 批量操作
# 批量修改权限
find /var/www -type f -exec chmod 644 {} +
find /var/www -type d -exec chmod 755 {} +# 批量修改用户
find /var/www -exec chown www-data:www-data {} +# 批量备份
find . -name "*.conf" -exec cp {} {}.bak \;# 批量压缩
find . -name "*.log" -mtime +7 -exec gzip {} \;# 批量替换文本
find . -name "*.py" -exec sed -i 's/old_name/new_name/g' {} +
十二、技巧与最佳实践
12.1 性能优化
# 限制搜索深度
find . -maxdepth 3 -name "*.py"# 排除目录
find . -not -path "*/.git/*" -not -path "*/node_modules/*" -type f# 使用 + 而不是 \;
find . -name "*.log" -exec rm {} + # 快
find . -name "*.log" -exec rm {} \; # 慢# 指定文件系统
find . -xdev -type f -size +100M # 不跨文件系统# 使用 locate 替代(更快,但有延迟)
sudo updatedb
locate filename
12.2 常见陷阱
陷阱 1:权限不足
# 重定向错误
find / -name "*.conf" 2>/dev/null# 使用 sudo
sudo find / -name "*.conf"
陷阱 2:文件名含空格
# 使用 -print0 和 xargs -0
find . -name "*.jpg" -print0 | xargs -0 rm# 或使用 -exec
find . -name "*.jpg" -exec rm {} +
陷阱 3:-exec 结尾
# \; 对每个文件执行一次
find . -name "*.log" -exec grep "error" {} \;# + 批量执行(更高效)
find . -name "*.log" -exec grep "error" {} +
12.3 实用别名
# 添加到 ~/.bashrc# 快速搜索文件
alias ff='find . -type f -name'# 快速搜索目录
alias fd='find . -type d -name'# 搜索大文件
alias fbig='find . -type f -size +100M -exec ls -lh {} \;'# 搜索最近修改
alias frec='find . -type f -mmin -60'# 搜索空文件
alias fempty='find . -type f -empty'# 按内容搜索
alias fcont='find . -type f -exec grep -il'
附录
A. 选项速查表
搜索条件
| 选项 |
说明 |
-name |
文件名 |
-iname |
文件名(忽略大小写) |
-type |
文件类型 |
-size |
文件大小 |
-mtime |
修改时间(天) |
-mmin |
修改时间(分钟) |
-atime |
访问时间(天) |
-ctime |
变更时间(天) |
-perm |
权限 |
-user |
用户 |
-group |
用户组 |
-empty |
空 |
-path |
路径匹配 |
-regex |
正则匹配 |
-maxdepth |
最大深度 |
-prune |
排除目录 |
动作
| 选项 |
说明 |
-print |
打印(默认) |
-ls |
详细列表 |
-delete |
删除 |
-exec |
执行命令 |
-ok |
确认执行 |
-printf |
自定义输出 |
逻辑
| 操作符 |
说明 |
-a |
AND(默认) |
-o |
OR |
! / -not |
NOT |
() |
分组 |
B. 常用命令
# 按名称
find . -name "*.txt"# 按类型
find . -type f
find . -type d# 按大小
find . -size +100M# 按时间
find . -mtime -7# 排除目录
find . -not -path "*/.git/*"# 执行命令
find . -name "*.log" -exec rm {} +# 删除空文件
find . -empty -delete# 组合搜索
find . -type f -name "*.py" -mtime -1 -not -path "*/venv/*"
C. 在线资源
- GNU Find: https://www.gnu.org/software/findutils/
- man page:
man find
- find 教程: https://man7.org/linux/man-pages/man1/find.1.html