如何在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自然识别不了这种带乱码的路径。
那正确的做法应该是这样的:
- 首先让
ls输出不带颜色的纯路径,避免混入控制字符; - 利用Nu的结构化查询筛选目标文件;
- 提取纯文件路径传递给外部程序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
相关产品推荐
相关产品推荐

