Nushell 递归搜索时如何跳过无权限访问的目录?
数据阿明
结论
如果知道哪个目录无法访问,可以用 glob --exclude 将它排除。Nushell 的 glob 支持排除目录,也不会继续遍历匹配目录中的内容。ls 和 glob 的文档没有列出通用的“遇到权限错误后继续”选项。do --ignore-errors 可以忽略执行过程中的错误,但不能保证搜索会跳过出错目录并扫描完其余路径。glob 命令文档、do 命令文档
排除报错目录
先切换到 AppData 目录,再运行搜索。请将示例用户名替换为实际路径:
cd 'C:\Users\my_name\AppData'
glob '**/*' --exclude ['**/Local/Application Data/**'] | where { |path| $path | str contains '251204' }
这条命令会排除报错目录及其内部路径,再从结果中筛选包含 251204 的路径。glob 文档说明,--exclude 接受排除模式,匹配的目录内容不会被遍历。Nushell 的 ls 也支持递归 glob;要排除目录时,直接使用 glob 更合适。glob 命令文档、ls 命令文档
如果从其他目录启动搜索,排除模式需要对应调整,以匹配搜索根目录。你也可以缩小搜索范围,只查找需要的子目录。如果权限错误来自其他目录,就把该目录的相对路径也加入排除列表。
关于忽略错误
可以试试用 do --ignore-errors 忽略闭包执行时的错误:
do --ignore-errors { ls -f **/* }
这适合只想压下错误的情况,但不能保证递归遍历遇到拒绝访问的目录后会恢复搜索。要可靠地跳过已知路径,优先使用排除模式。若报错目录事先未知,现有材料无法确认 Nushell 在当前版本和 glob 后端下能否逐目录恢复遍历。
备注:内容仅供参考。
