nushell:递归列出所有文件

nushell:递归列出所有文件

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

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

  1. 我试过了ls **,但是没有用。
  2. 我谷歌了一下,ls **/**.rs发现来自 Bash并尝试了ls **/*。这似乎有效,但我不得不通过艰难的方式学习,它只列出一些文件,而不是全部。我不知道为什么。但我找到了一个例子,其中ls **/* | where name =~ 'xxx'发现少于ls **/*xxx*。(我想在这里包括我的例子,以显示列出了什么,没有列出什么。但文件夹结构太大了。)
  3. 我不能使用,ls **/*xxx*因为我不想每次都按名称过滤。有时我只需要按其他列过滤。

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

答案1

我认为我们在评论和聊天中解决这个问题时至少确定了两件事:

  • ls -a应该用来确保隐藏目录中的文件包含在结果中。

  • Nushell 目前似乎存在一个错误,因此ls **/*abc*有时会返回隐藏目录中的文件,但不是(奇怪地)匹配“abc”但会忽略隐藏目录中匹配的文件。如果真有的话,我希望结果相反,但我真的希望ls总是忽略隐藏目录中的文件,除非-a使用了该标志。

    我写了一个Github 问题关于该主题。

因此目前,为了可靠地返回所有文件“xxx”在文件名中或者路径,使用ls -a **/*xxx*

如果您只想返回“xxx”在里面文件名(但不是路径的任何其他部分),然后:

ls -a **/*xxx* | where ($it.name | path basename) =~ 'xxx'

请注意,实验性的 Nushellglob命令(在 0.61 中)将始终使用 返回隐藏目录中的文件glob **/*xxx*,但它只返回文件名,而不是像 Nushell 列中的文件ls,因此听起来它不适合你的用例:

有时我只需要按其他列进行过滤

同样的情况也发生在^find(不是内置的,而是二进制的)。

但是,请注意,使用ls返回文件名进行处理确实有一些限制,至少对于目前的 Nushell 命令来说是这样:

  • 当前没有办法将结果限制到单个文件系统,就像选项一样^find -xdev
  • Nushellls **/*将递归跟踪符号链接。如果您有类似 的内容ln -s .. parentls则会进入无限循环。 find默认情况下,不跟踪符号链接。

总体而言,我会非常小心地ls **/...在当前的 Nushell 版本中使用 glob。^find二进制文件可能是一个更安全的选择,至少目前如此。

答案2

我的原始答案已解决,因此,以递归方式列出所有(非隐藏)子目录中的所有(非隐藏)文件和子目录(在 Nushell 0.76 上测试):

ls **/*

要包含隐藏文件:

ls -a **/*

模式匹配也能正常工作。例如:

ls **/*.rs

以递归方式列出目录名称,但不列出其中的文件:

ls **/**

答案3

find ./*

或安装

tree

“正文必须至少包含 30 个字符;您输入了 24 个。”

相关内容