nushell:递归列出所有文件

use*_*860 5 shell nushell

如何使用 nu shell 递归列出文件?

更具体地说:指定文件夹和每个内部文件夹中的所有文件、文件夹和其他所有内容,递归地。

  1. 我尝试过ls **,但这不起作用。
  2. 我用谷歌搜索,找到了ls **/**.rs来自Bash并尝试了ls **/*。这似乎有效,但我必须经历惨痛的教训才知道它只列出了一些文件,而不是全部。我不知道为什么。但我找到了一个例子,ls **/* | where name =~ 'xxx'发现小于ls **/*xxx*. (我考虑在这里包含我的示例,以显示列出的内容和未列出的内容。但是文件夹结构太大。)
  3. 我无法使用ls **/*xxx*,因为我不想每次都按名称过滤。有时我只需要按其他列进行过滤。

(我希望这个解决方案是独立于操作系统的。毕竟,nu在其主页上称赞的第一个优点是:“Nu适用于Linux、macOS和Windows。学习一次,然后在任何地方使用它。”)

Not*_*1ds 3

我认为我们在评论和聊天中至少确定了两件事:

  • 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选项一样将结果限制为单个文件系统。
  • Nushellls **/*将递归地跟踪符号链接。如果你有类似的东西ln -s .. parent,那么ls将进入无限循环。 find默认情况下,不遵循符号链接。

一般来说,ls **/...在当前的 Nushell 版本中使用 glob 时我会非常小心。^find至少目前来说,二进制文件可能是一个更安全的选择。