如何在Nushell中递归搜索目录时避免权限错误?
问题
在Nushell中执行ls -f **/*递归遍历用户AppData文件夹时,进程因权限问题提前终止,错误信息如下:
Error: nu::shell::error × Error extracting glob pattern ╭─[entry #53:1:1] 1 │ ls -f **/* · ─┬ · ╰── attempting to read `C:\Users\my_name\AppData\Local\Application Data` resulted in an error: Access is denied. (os error 5) ╰────
原本计划通过ls -f **/* | find 251204递归搜索含"251204"的文件,希望找到简单方法避免/忽略无权限目录,允许命令继续执行并仅提示权限错误。
解决方案
以下是几个适合Nushell新手的简单方案:
1. 使用glob命令配合--ignore-errors参数
glob命令专门用于匹配文件路径,自带忽略错误的选项,能跳过权限不足的目录继续执行:
glob **/* --ignore-errors | find 251204
--ignore-errors会让命令忽略权限拒绝、文件不存在等错误,不会终止进程- 最终仍会输出所有可访问路径中符合条件的文件
2. 用errors suppress包裹ls命令
Nushell的错误抑制块可以捕获并忽略指定命令的错误,让ls继续遍历其他目录:
errors suppress { ls -f **/* } | find 251204
errors suppress {}会包裹住可能出错的ls命令,权限错误会被抑制,进程不会中断- 如果需要保留权限错误提示,可改用
errors capture并过滤结果:
这里errors capture { ls -f **/* } | where type == "value" | find 251204where type == "value"会过滤掉错误条目,只保留正常的文件路径。
3. 直接指定目标子目录(更高效)
如果你确定目标文件不在权限受限的目录里,可以直接指定要遍历的子目录,完全避开权限问题:
ls -f Roaming/**/* | find 251204 # 或者同时遍历多个目录 ls -f {Roaming,Local/MyApps}/**/* | find 251204
这种方法不仅避免了权限错误,还能减少遍历的文件数量,提升搜索速度。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

