如何使用 nu shell 递归列出文件?
更具体地说:递归地查找指定文件夹和每个内部文件夹中的所有文件、文件夹和所有其他文件。
- 我试过了
ls **
,但是没有用。 - 我谷歌了一下,
ls **/**.rs
发现来自 Bash并尝试了ls **/*
。这似乎有效,但我不得不通过艰难的方式学习,它只列出一些文件,而不是全部。我不知道为什么。但我找到了一个例子,其中ls **/* | where name =~ 'xxx'
发现少于ls **/*xxx*
。(我想在这里包括我的例子,以显示列出了什么,没有列出什么。但文件夹结构太大了。) - 我不能使用,
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
。 - Nushell
ls **/*
将递归跟踪符号链接。如果您有类似 的内容ln -s .. parent
,ls
则会进入无限循环。find
默认情况下,不跟踪符号链接。
总体而言,我会非常小心地ls **/...
在当前的 Nushell 版本中使用 glob。^find
二进制文件可能是一个更安全的选择,至少目前如此。
答案2
我的原始答案已解决,因此,以递归方式列出所有(非隐藏)子目录中的所有(非隐藏)文件和子目录(在 Nushell 0.76 上测试):
ls **/*
要包含隐藏文件:
ls -a **/*
模式匹配也能正常工作。例如:
ls **/*.rs
以递归方式列出目录名称,但不列出其中的文件:
ls **/**
答案3
find ./*
或安装
tree
“正文必须至少包含 30 个字符;您输入了 24 个。”