You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nushell中将筛选后的文件列表传递给外部程序?

如何在Nushell中将筛选后的文件列表传递给外部程序?

我明白你想在Nushell里完成“恢复所有文件名包含GENERATED的文件”这个需求,之前尝试的几种方法踩了Nu的结构化数据和输出格式的坑,我来帮你梳理下问题和正确的做法。

首先分析你遇到的几个问题:

  • 第一个命令ls --all --full-paths **/* | find GENERATED | git checkout --:Nu里的ls输出的不是纯字符串列表,而是包含文件信息的结构化记录(比如name、type、size这些字段),直接管道给find再到git,git无法识别这些结构化数据,自然拿不到正确的文件路径。
  • 第二个命令ls ... | each { |it| git checkout -- $it }:这里的$it是完整的文件记录,不是字符串路径,Nu尝试把记录转成字符串时就报错了,因为外部程序只能接收字符串参数。
  • 第三个命令的错误是因为ls默认输出带颜色的ANSI控制码,导致$it.name里混了颜色标记,git自然识别不了这种带乱码的路径。

那正确的做法应该是这样的:

  1. 首先让ls输出不带颜色的纯路径,避免混入控制字符;
  2. 利用Nu的结构化查询筛选目标文件;
  3. 提取纯文件路径传递给外部程序git。

给你两个可行的命令:

方法一:用where做结构化筛选(更符合Nu的风格)

ls --all --full-paths --no-color **/* | where name contains 'GENERATED' | each { |file| git checkout -- $file.name }
  • --no-color:关闭颜色输出,确保路径是纯字符串,没有ANSI控制码;
  • where name contains 'GENERATED':直接在结构化数据里筛选文件名包含目标字符串的文件,比用find更精准;
  • each { |file| git checkout -- $file.name }:遍历每个筛选后的文件记录,提取name字段(因为加了--full-paths,这里的name就是完整路径)传递给git。

方法二:转成纯字符串列表后处理

如果你习惯类似Bash的字符串管道方式,也可以先把ls的输出转成纯路径字符串,再筛选:

ls --all --full-paths --no-color **/* | get name | find GENERATED | str collect '\n' | git checkout -- -
  • get name:提取所有文件的完整路径字符串;
  • find GENERATED:筛选包含GENERATED的路径;
  • str collect '\n':把所有路径用换行符拼接成一个字符串;
  • git checkout -- -:让git从标准输入读取路径列表(-表示从stdin读取)。

这样就能完美实现你想要的“恢复所有含GENERATED的文件”的需求啦。

备注:内容来源于stack exchange,提问作者user194860

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 12:19:40