如何使用 nu shell 递归列出文件?
更具体地说:指定文件夹和每个内部文件夹中的所有文件、文件夹和其他所有内容,递归地。
ls **,但这不起作用。ls **/**.rs来自Bash并尝试了ls **/*。这似乎有效,但我必须经历惨痛的教训才知道它只列出了一些文件,而不是全部。我不知道为什么。但我找到了一个例子,ls **/* | where name =~ 'xxx'发现小于ls **/*xxx*. (我考虑在这里包含我的示例,以显示列出的内容和未列出的内容。但是文件夹结构太大。)ls **/*xxx*,因为我不想每次都按名称过滤。有时我只需要按其他列进行过滤。(我希望这个解决方案是独立于操作系统的。毕竟,nu在其主页上称赞的第一个优点是:“Nu适用于Linux、macOS和Windows。学习一次,然后在任何地方使用它。”)
我认为我们在评论和聊天中至少确定了两件事:
ls -a应该用于确保隐藏目录中的文件包含在结果中。
目前 Nushell 中似乎存在一个错误,因此ls **/*abc*有时会返回隐藏目录中与“abc”不(奇怪)匹配的文件,但会忽略隐藏目录中匹配的文件。如果有的话,我希望结果会相反,但我真的希望总是忽略隐藏目录中的文件,除非使用该标志。ls-a
我已经写了一个关于这个主题的Github 问题。
因此,目前,要可靠地返回文件名或路径中包含“xxx”的所有文件,请使用.ls -a **/*xxx*
如果您只想返回文件名中包含“xxx”的文件(而不返回路径的任何其他部分),则:
ls -a **/*xxx* | where ($it.name | path basename) =~ 'xxx'
Run Code Online (Sandbox Code Playgroud)
请注意,实验性 Nushellglob命令(在 0.61 中)将始终使用 来返回隐藏目录中的文件glob **/*xxx*,但它只返回文件名,而不是像 那样返回 Nushell 列中的文件ls,因此听起来它不适用于您的用例:
有时我只需要按其他列进行过滤
这同样适用^find(不是内置的,而是二进制的)。
但是,请注意,使用ls返回文件名进行处理确实有一些限制,至少对于当前的 Nushell 命令来说是这样:
^find -xdev选项一样将结果限制为单个文件系统。ls **/*将递归地跟踪符号链接。如果你有类似的东西ln -s .. parent,那么ls将进入无限循环。 find默认情况下,不遵循符号链接。一般来说,ls **/...在当前的 Nushell 版本中使用 glob 时我会非常小心。^find至少目前来说,二进制文件可能是一个更安全的选择。