find命令已显式排除不可读目录仍尝试访问报错的解决方法
问题根因
find 的执行逻辑和常规认知里的规则生效顺序存在本质差异:
-not -path 目标路径属于路径过滤规则,仅对已经生成完整路径字符串的条目生效,作用是判断该路径是否需要被纳入最终输出结果- 当
find在父目录层级扫描到子目录条目时,会默认触发递归进入的动作,这个动作发生在完整路径生成、规则匹配流程之前。哪怕后续规则判断到该路径需要被排除,find已经提前发起了对目标目录的访问请求,自然会因为权限不足抛出拒绝错误。
对应解决方法
- 搭配
-prune动作从遍历层直接阻断访问
调整命令结构,将目标路径的匹配规则和-prune动作绑定,让find在父目录扫描到目标子目录的瞬间,直接终止后续的递归进入流程,根本不会发起对无权限目录的权限校验请求:find $HOME/Dev/missing \( -path '/home/filip/Dev/missing/.password-store' -prune \) -o -print
这种方案从执行逻辑上彻底跳过了目标目录的遍历动作,既不会输出权限报错,也不会额外消耗遍历资源,完全匹配不访问已排除不可读目录的需求。 - 重定向错误流屏蔽报错展示
如果不需要从逻辑上阻止遍历动作,只是不想在终端看到权限拒绝的提示,可以将find输出到标准错误流的内容重定向到空设备:find $HOME/Dev/missing -not -path '/home/filip/Dev/missing/.password-store' 2>/dev/null
这种方案本质是隐藏报错信息,find依然会尝试访问无权限的目标目录,只是所有权限相关的提示不会出现在最终输出中,适合临时快速处理的场景。
内容的提问来源于stack exchange,提问作者Filip Banák
相关产品推荐
相关产品推荐

