双星号通配符是什么意思?

Mik*_*air 48 unix wildcard shopt

我已经尝试了以下命令,但我无法解释它:

ls **
Run Code Online (Sandbox Code Playgroud)

但我不确定它输出的确切原因以及为什么会产生结果.

Kei*_*son 127

它可能正在使用某些shell的特殊功能来**进行递归匹配,而不是单个*,它只在当前目录中匹配.

通配符*匹配.当前目录中的任何文件或目录(其名称不以其开头).

取决于您正在使用的shell以及** 可能与之相同的设置*; 它可以匹配零个或多个字符后跟零个或多个字符,这与仅匹配零个或多个字符相同.

但是有些shell,有一些设置,**是一个递归版本*,匹配当前目录和子目录中的所有文件和目录.

引用bash手册:

`*'
匹配任何字符串,包括空字符串.当启用`globstar'hell选项,并且在文件名扩展上下文中使用`*'时,用作单个模式的两个相邻`*将匹配所有文件以及零个或多个目录和子目录.如果后跟一个`/',则两个相邻的``*'将只匹配目录和子目录.

仅当globstar通过以下方式设置选项时,此方法才有效

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

(默认情况下禁用)并且仅在相对较新版本的bash.

我相信zsh也支持这种语法.

重要的是要记住,通配符是由shell扩展的,而不是ls命令扩展的.如果您键入ls **,或ls *.txt,在ls命令本身不会看到*字符; 它只能看到扩展的文件列表,就像您在命令行上输入了整个列表一样.

  • 这应该是批准的答案! (2认同)

Yog*_*ity 70

流口水

通过使用双星号 ( **),您可以使用glob列出文件系统上的文件。glob 是用于匹配文件路径的文字或通配符字符串。使用一个或多个glob来定位文件系统上的文件称为globbing

除了 Linux shells,在各种配置文件中也使用 globbing 来指定要定位的文件列表。例如:文件中要忽略的文件和文件夹.gitignorefiles以及Typescript 项目includetsconfig.json文件中的选项等。

以下是通配符的一些最重要的方面,双星号 ( **) 就是其中之一:


段和分隔符 ( /)

分隔符始终是/字符。段是两个分隔符之间的所有内容。

例子: Tests/HelloWorld.js

这里, TestsandHelloWorld.js是段, and/是分隔符。


单个星号 ( *)

单个星号 ( *) 匹配一个段中的零个或多个字符。它用于对一个目录中的文件进行通配。

例子: *.js

此 glob 将匹配文件,例如HelloWorld.js但不匹配文件,例如Tests/HelloWorld.jsTests/UI/HelloWorld.js


双星号 ( **)

双星号 ( **) 匹配多个段中的零个或多个字符。它用于对嵌套目录中的文件进行通配。

例子: Tests/**/*.js

在这里,文件选择将被限制在Tests目录中。glob 将匹配诸如Tests/HelloWorld.js, Tests/UI/HelloWorld.js,之类的文件Tests/UI/Feature1/HelloWorld.js


问号( ?)

问号( ?) 匹配一个段中的单个字符。当某些文件或目录的名称仅相差一个字符时,您可以使用?.

例子: tests/?at.js

这将匹配文件,如tests/cat.jstest/Cat.jstest/bat.js


方括号 ( [abc])

方括号 ( [...]) 将文件与方括号中提到的单个字符连接起来。

例子: tests/[CB]at.js

这个 glob 将匹配文件,如tests/Cat.jstests/Bat.js


方括号范围 ( [a-z])

方括号范围 ( [a-z]),匹配范围中指定的一个字符。

例子: tests/feature[1-9]/HelloWorld.js

这个 glob 将匹配文件,如tests/feature1/HelloWorld.js,test/feature2/HelloWorld.js等等... upto 9


否定 ( !)

否定 (!) 可用于排除某些文件。

示例 1: tests/[!C]at.js

这将排除该文件tests/Cat.js并匹配tests/Bat.js, tests/bat.js,等文件tests/cat.js

否定也用于数组内的配置文件中以否定或排除某些文件。

示例 2: ['Tests/**/*.js', '!Tests/UI/**']

这将从Tests/UI目录中排除所有文件和文件夹。


就是这样!希望有帮助!

  • 注意:在最近的 bash 版本中默认禁用 `globstar` shell 选项,因此 `**` (双星号)将与 `Tests/HelloWorld.js` 不匹配。要启用它,请使用“shopt -s globstar”和“shopt -u globstar”来禁用。 (5认同)
  • @MissSwiss `*/**` 不会匹配直接位于 `node_modules` 内的文件,而 `**` 会匹配。例如,“*/**”不会匹配“node_modules/abc.js”,但会匹配“node_modules/level1/abc.js”。 (2认同)
  • @AdmiralAdama,“{...}”是一个扩展,而不是一个通配符。扩展发生在通配之前。因此,例如,“*.{js,ts,java}”将生成“*.js *.ts *.java”。 (2认同)

vas*_*vas 12

虽然一个或多个其他答案可能是正确的,但它们有点难以理解,尤其是如果您是像我这样的视觉人士。

所以我决定提供一个直观的答案,完全由测试证实

我创建了以下目录结构,每个级别有两个文件“f”,一个有文件扩展名,一个没有文件扩展名,然后在启用 globstar 的 Darwin 上使用以下命令测试下面表头中的所有模式:stat -f "%N" <pattern>.

如果您是视觉型的人,与仅阅读其他好答案中的定义相比,查看表格可以让您更深入地了解**含义

.
??? f
??? f.txt
??? x
    ??? f
    ??? f.txt
    ??? y
        ??? f
        ??? f.txt
        ??? z
            ??? f
            ??? f.txt
Run Code Online (Sandbox Code Playgroud)

相比***

* ** x/*
或者
*/*
x/**
或者
*/**
*/*.* **/*.* */ **/
f ? ?
f.txt ? ? ?
x ? ? ? ? ?
x/f ? ? ?
x/f.txt ? ? ? ? ?
x/y ? ? ? ?
x/y/f ? ?
x/y/f.txt ? ? ?
x/y/z ? ? ?
x/y/z/f ? ?
x/y/z/f.txt ? ? ?

匹配.txt文件:

*.txt */*.txt x/*/*.txt **/*.txt x/**/*.txt
f
f.txt ? ?
x
x/f
x/f.txt ? ? ?
x/y
x/y/f
x/y/f.txt ? ? ?
x/y/z
x/y/z/f
x/y/z/f.txt ? ?

  • 名称中带有星号的文件夹怎么样? (2认同)
  • @pablete:`*` 还包括名称中带有星号的文件。如果你想选择这样的文件,你可以使用`ls *'*'*`(只需在星号周围加上引号) (2认同)

Mor*_*gen 7

其他答案已经很好地涵盖了这个特定通配符的确切行为,但有关一般情况的信息可能很有用.

此行为不限于ls,并且被称为"globbing",它是基于与现有文件名匹配的模式扩展.请务必注意,这些模式不使用正则表达式语法.

shell在将参数发送到程序之前对其进行预处理.通常有多个级别的扩展,其中一些涉及通配.

有关文件glob模式中可用的其他通配符的更多信息的一个很好的资源是unix手册页.可以在这里找到glob的在线版本.

最后,一个简单的例子说明这可以为你做什么,特别是当与其他shell扩展好东西结合使用时,在这种情况下由bashshell 提供.有关此示例中使用的扩展的信息可以在Bash初学者指南中找到- 这是我的goto资源,尽管有标题.

ls *{01..04}.{txt,csv}ls *01.txt *01.csv *02.txt *02.csv *03.txt *03.csv *04.txt *04.csv

哪个可以输出这样的东西:

input_01.txt input_02.txt input_03.txt input_04.txt output_01.csv output_02.csv output_03.csv output_04.csv
Run Code Online (Sandbox Code Playgroud)

跳过这些:

input_05.txt input_06.txt input_07.txt input_08.txt input_09.txt input_10.txt output_05.csv output_06.csv output_07.csv output_08.csv output_09.csv output_10.csv
Run Code Online (Sandbox Code Playgroud)

一个简单的例子,但如果你知道这种行为是不特定ls,那么你能想象的实用程序时加上mv,cp,rsync,等.