我希望Nu为我找到一些文件,过滤它们并将它们传递给外部程序。例如:“使用 Git 恢复名称包含‘GENERATED’的所有文件。” 我尝试了几种变体,但没有一个起作用:
# Doesn't pass the files:
ls --all --full-paths **/* | find GENERATED | git checkout --
# Returns an error: "Cannot convert record<name: string, type: string, size: filesize, modified: date> to a string"
ls --all --full-paths **/* | find GENERATED | each { |it| git checkout -- $it }
# Returns an error for every file: "error: Path specification »?[37m/home/xxx/com.?[0m?[41;37mgwt?[0m?[37mplugins.?[0m?[41;37mgwt?[0m?[37m.eclipse.core.prefs?[0m« does not match any file known to git" [Manually translated into English]
ls --all --full-paths **/* | find GENERATED | each { |it| git checkout -- $it.name }
在 Nu 中这样做的正确方法是什么?
我知道如何用 Bash 做到这一点。这个问题只是关于Nu。:-)
最简洁和精确的方法是这样的:
这使用
where
命令根据正则表达式过滤列(在本例中由于标志而name
包含完整路径和文件名) - 在您的情况下。-af
'GENERATED'
命令前面的插入符号
git
用于确保您调用外部 git 命令。如果您确实想调用外部函数,那么这样做是一个很好的做法。如果您将其保留,它有可能调用该命令的内部版本。例如,ls
调用Nushell的内部ls命令,同时^ls
将调用外部ls命令。文档: https: //www.nushell.sh/book/escaping.html它还使用
$in
包含管道结果的值。您不需要将它each
作为参数传递到闭包中 - 它会自动可用。文档: https: //www.nushell.sh/book/pipelines.html您可以
find
改为使用,但它不太精确,因为它会搜索结果表中的所有列,而不是针对特定列。您还需要小心地去除 ansi 代码,因此您最好坚持使用where
.或者
请注意,我没有使用 git checkout 对此进行测试,但我确实尝试了其他一些 git 命令,并且上述所有命令都有效。