find / -name "filename" 常失败因遍历 /proc /sys /dev 等虚拟文件系统触发大量权限错误且耗时;应排除这些路径并重定向错误,或改用 locate(需先 sudo updatedb)。

直接用 find / -name "filename" 是可行的,但几乎一定会遇到权限拒绝和性能问题,不建议无准备执行。
为什么 find / -name 常常失败
搜索根目录时,find 会尝试进入所有子目录,包括 /proc、/sys、/dev 这类虚拟文件系统,它们不存真实文件,但会触发大量 Permission denied 错误,刷屏且干扰判断。同时,遍历整个硬盘耗时长,尤其在机械盘或大容量 NAS 上可能卡住几分钟。
- 错误典型表现:
find: ‘/proc/12345/fd’: Permission denied - 即使加了
sudo,也无法访问某些内核暴露的路径(如/proc/kcore) -
find默认不忽略错误,输出混杂导致 grep 不可靠
安全又实用的写法:跳过危险路径 + 抑制错误
真正能落地的命令是把常见“不可读目录”排除掉,并把错误输出重定向掉:
sudo find / \ -path '/proc' -prune -o \ -path '/sys' -prune -o \ -path '/dev' -prune -o \ -path '/run' -prune -o \ -name "config.json" -print 2>/dev/null
说明:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
-path '/proc' -prune表示匹配到/proc就跳过其下全部内容,不递归 -
-o是逻辑“或”,确保每个-prune独立生效 -
2>/dev/null把所有Permission denied等 stderr 输出丢弃 - 最后的
-print显式输出匹配结果(部分 shell 默认隐含,但显式更稳)
比 find / 更快的替代方案:用 locate
如果只是查文件名(不依赖实时状态),locate 几乎秒出结果,但它依赖数据库,需提前更新:
- 先运行
sudo updatedb(首次或文件系统变动后必须) - 再执行
locate -i "config.json"(-i忽略大小写) - 注意:
locate查不到刚新建/刚移动的文件,数据库默认每天更新一次 - 它不支持按大小、时间、权限等复杂条件,纯名字匹配场景才适用
实际使用时容易漏掉的关键点
文件名匹配默认区分大小写,且通配符需引起来,否则会被 shell 提前展开:
- 错:
find / -name *.log→ 如果当前目录有access.log,shell 会把它替换成access.log再传给 find - 对:
find / -name "*.log"或find / -name '*.log' - 想不区分大小写?用
-iname,不是-name -i - 如果目标文件在加密 home 目录(如 ecryptfs)、挂载的 NTFS 分区或 snap 沙盒里,
find /可能根本看不到——得单独查对应挂载点










