Linux 文件搜索命令全解析(提升搜索效率与精度)
三类工具分工:
- find:实时、强大、按各种条件搜(最常用)
- locate:数据库秒级搜(快但不是实时)
- which / whereis / type:找命令本身
- grep:搜文件内容(不是搜文件名)
一、find 基础语法
find 搜索路径 [条件] [动作]
不写路径默认当前目录;不写条件默认列出所有文件。
1. 按文件名搜索(最常用)
find /etc -name "*.conf" # 区分大小写
find /etc -iname "*.Conf" # 不区分大小写
find /var/log -name "*.log"
find /home -name "*.txt" -o -name "*.md" # 或
find /tmp ! -name "*.sock" # 取反
2. 按文件类型
find /path -type f # 普通文件
find /path -type d # 目录
find /path -type l # 软链接
find /path -type s # socket
3. 按大小
find / -size +100M # 大于100M
find / -size -10k # 小于10k
find / -size +500M -size -1G
# 单位:c字节 k M G
4. 按时间
# mtime 修改内容时间(天)
find /var/log -mtime +7 # 7天前
find /var/log -mtime -1 # 24小时内
find /var/log -mmin +30 # 30分钟前
# atime 访问时间 / ctime 状态改变时间
find /etc -ctime -1
5. 按属主 / 属组
find /home -user zhangsan
find /home -group developers
find / -nouser # 属主已被删除的文件(垃圾文件)
6. 按权限
find / -perm 644 # 精确等于644
find / -perm -4000 # 带SUID的文件(安全排查)
find /tmp -perm -o=w # 其他人可写
二、find 找到后执行动作
-exec(最经典)
# 找到后 ls -lh 看大小
find /var/log -name "*.log" -exec ls -lh {} \;
# 删掉7天前日志
find /var/log/app -name "*.log" -mtime +7 -exec rm -f {} \;
# 批量改权限
find /web -type f -exec chmod 644 {} \;
find /web -type d -exec chmod 755 {} \;
{}代表找到的文件,\;是结束符(前面有空格)。
-delete(简单删除)
find /tmp -name "*.tmp" -delete
用 xargs(更快,批量处理)
# 找出大文件并列出
find / -xdev -type f -size +500M -print0 | xargs -0 ls -lh
# 统计总大小
find /var/log -name "*.log" -print0 | xargs -0 du -ch
-print0+xargs -0处理文件名含空格 / 换行的情况,安全写法。
三、locate:数据库秒搜
yum install mlocate -y
updatedb # 立即更新数据库
locate nginx.conf # 秒出结果
locate -i *.py # 不区分大小写
locate -n 20 *.log # 只看前20条
特点:
- 比
find / -name快几个数量级 - 缺点:不是实时,数据库每天由 cron 更新一次;新文件找不到就
updatedb - 适合按文件名模糊查找
四、找命令本身
which nginx # 可执行文件路径
whereis nginx # 命令+源码+man手册
type cd # 判断是内建命令还是外部文件
type ll
compgen -c # 列出所有可执行命令
五、按内容搜文件:grep 配合 find
# 在所有py文件里搜"password"
grep -rn "password" /etc --include="*.conf"
# 找包含某关键字的配置文件
grep -rl "listen 80" /etc/nginx/
# find + grep 组合
find /var/www -name "*.php" -exec grep -l "mysql_connect" {} \;
六、高级组合技巧
1. 多条件 AND / OR
# 大于100M 且 是.log
find /var -type f -size +100M -name "*.log"
# .txt 或 .md
find /docs -name "*.txt" -o -name "*.md"
# 注意优先级,OR 组合要加括号
find /docs \( -name "*.txt" -o -name "*.md" \) -size +1M
2. 排除目录
find / -path /proc -prune -o -name "*.log" -print
find / -path /proc -prune -o -path /sys -prune -o -name "*.conf" -print
3. 查磁盘大文件(生产排障必用)
# 根分区下找大于500M的文件
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h
-xdev不跨文件系统,避免扫到挂载的别的盘。
4. 找最近修改的配置文件
find /etc -mtime -1 -type f
5. 找 SUID 高危文件(安全检查)
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null
七、性能建议
- 别在
/下裸跑find / -name xxx:会扫 proc/sys 等虚拟文件系统,慢且报错一堆。加2>/dev/null屏蔽权限错误,或加-xdev。 - 知道大概目录就缩小范围:
find /etc比find /快几百倍。 - 模糊查找用 locate:文件名记得个大概,先
locate,比 find 快。 - 删除操作用 -delete 或先 ls 确认:
# 先看要删什么
find /var/log/app -name "*.log" -mtime +7 -ls
# 确认无误再删
find /var/log/app -name "*.log" -mtime +7 -delete
八、一行实战
1. 找出磁盘占用最大的 10 个文件
find / -xdev -type f -size +100M -exec du -h {} \; 2>/dev/null | sort -rh | head -10
2. 批量把 .txt 改成 .md
find . -name "*.txt" -exec bash -c 'mv "$1" "${1%.txt}.md"' _ {} \;
3. 清空所有大于 100M 的日志
find /var/log -name "*.log" -size +100M -exec truncate -s 0 {} \;
4. 找今天改过的所有文件
find /home -type f -mtime -1
5. 找空文件 / 空目录
find /tmp -type f -empty
find /tmp -type d -empty
九、常见问题
- find 报一堆 Permission denied:加
2>/dev/null屏蔽。 - 中文文件名乱码:
export LANG=C.UTF-8。 - 文件名带空格:用
find -print0 | xargs -0,不要直接 xargs。 - locate 找不到新文件:先
updatedb。 - find 在 NFS / 挂载点慢:加
-xdev或先df -h确认挂载点。 - -exec vs xargs:文件少时 -exec 直观;文件多时 xargs 快(批量调用)。
十、速查表
表格
| 需求 | 命令 |
|---|---|
| 按名字 | find /path -name "*.log" |
| 按大小 | find / -size +100M |
| 按时间 | find / -mtime +7 |
| 按属主 | find /home -user zhangsan |
| 找后删除 | find ... -delete |
| 找后执行 | find ... -exec cmd {} \; |
| 秒搜 | locate filename |
| 找命令 | which / whereis |
| 找内容 | grep -rn "关键词" 目录 |
| 大文件 | find / -xdev -size +500M |
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END











暂无评论内容