如何启用双星**(globstar)运算符?

k0p*_*kus 8 command-line bash

我知道有一个类似于 的运算符*,不同之处在于它适用于所有子目录。

假设您有一个文件夹结构:

.
??? bar
?   ??? foo
?   ?   ??? baz
?   ?       ??? hurz
?   ?           ??? lolz
?   ?               ??? hello.txt
?   ??? poit.txt
??? fnord.txt
Run Code Online (Sandbox Code Playgroud)

然后ls用单星*将列出:

$ ls *.txt
fnord.txt
Run Code Online (Sandbox Code Playgroud)

我希望双星操作员**能够处理子文件夹,但它还没有完成。我知道这可以工作,因为我在另一台机器上启用了它,但我忘记了如何。

$ ls **/*.txt
bar/poit.txt
Run Code Online (Sandbox Code Playgroud)

我期待输出看起来像:

ls **/*.txt
bar/foo/baz/hurz/lolz/hello.txt  bar/poit.txt  fnord.txt
Run Code Online (Sandbox Code Playgroud)

如何**调用接线员以及如何正确激活它?

k0p*_*kus 14

您正在寻找 bash 版本 4 中引入的 globstar shell 选项。

如果您不确定正在运行的版本,可以通过以下方式进行测试:

$ echo $BASH_VERSION
4.4.12(1)-release
Run Code Online (Sandbox Code Playgroud)

检查它是否通过以下方式启用:

$ shopt globstar
Run Code Online (Sandbox Code Playgroud)

它默认为off. 如果你想使用它,你必须启用它:

$ shopt -s globstar
Run Code Online (Sandbox Code Playgroud)

然后它将按预期工作。您可能希望将此添加到您.bashrc的,以便在新 shell 中始终启用它。

要禁用它:

$ shopt -u globstar
Run Code Online (Sandbox Code Playgroud)

详情请参阅help shopt