更改通配符的响应字符 ( '**' )

更改通配符的响应字符 ( '**' )

我运行了一个通配符运算符

**

在目录列表中

ls -d "$PWD/"**/

但我注意到,在按回车键……等待……等待……之后,它在生成了数千行之后立即反省了答案。

是否可以使输出一次生成一行而不是一次生成一个全局变量?我想知道这是否是一个全局设置,或者一个操作系统设置,或者一个配置文件设置。

(有趣的是,这个问题跨越了外部显示(计算机显示器)和计算机内部处理之间的界限。

这个问题可以被认为是重新定位我的观察者从显示器的外部到计算机操作空间内部的某个地方,一个我不能去的地方,我的观察者不能去,但矛盾的是去并且刚刚去了那里,只是……它在一个非物理空间中,所以我们永远无法确定那个空间,或者那个空间的明显行为。

我将在不同的空间问另一个问题,关于是否有其他 shell 使我们能够通过使用这些不同的 shell 来查看计算机功能内部的这些空间,但我不会在这里进一步深入研究因为这超出了这个问题的范围。)

答案1

glob 也称为文件名生成的要点是生成与模式匹配的文件路径的(排序的)列表,然后传递给某个命令。

当然,在传递给命令之前需要先构建该列表,因为该列表作为系统调用的参数整体传递execve()

您不必在命令的参数中传递 glob,您还可以将结果分配给数组,如下所示:

files=( **/*.txt )

或者在循环中使用for

for file in **/*.txt; do...

但同样,列表首先被构建,排序,然后被处理。

如果您只想打印这些文件,那么您可以使用 zsh shell(最初**/来自 1992 年)将 shellprint作为 glob 限定符的一部分。就像:

**/*(N^e['print -r -- $REPLY'])

或者使用辅助函数和+funcname限定符代替e[code]

p() { print -r -- $REPLY; false; }

然后:

**/*(N+p)

或者之后set -o globstarshort

**(N+p)

或者:

**(/N+p)

对于文件类型目录仅限 。

请注意,该列表不会被排序。

当然,您可以使用ls -ld --of 来代替,print -r --但 whileprint是内置的,ls但不是,并且ls在每个文件的新进程中分别运行一个将导致成本高昂。

如果您确实需要从文件中获取更多信息,那么最好使用 zsh 的stat内置函数(zmodload zsh/stat首先加载它)。


1 此处使用/glob 限定符。请注意,如果您这样做**/,您还将获得目录的符号链接,并附/加到所有目录。

答案2

这听起来像是一项工作,find而不是ls通配符。

find "${PWD}" -type d

我什至不会触及技术/哲学的后言。

相关内容