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

Unix 双星号通配符是什么意思?,unix,wildcard,glob,shopt,Unix,Wildcard,Glob,Shopt,我尝试了以下命令,但在解释时遇到问题: ls ** 但是我不确定它到底输出了什么以及为什么会这样。它可能使用了一些shell的一个特殊功能,让**进行递归匹配,而不是只在当前目录中匹配的单个* 通配符*匹配当前目录中的任何文件或目录(其名称不以开头) 根据您使用的shell和设置,**可能等同于*;它可以匹配零个或多个字符,后跟零个或多个字符,这与只匹配一次零个或多个字符相同 但是对于某些shell,在某些设置下,**是*的递归版本,匹配当前目录和子目录中的所有文件和目录 引述: `*“ 匹配

我尝试了以下命令,但在解释时遇到问题:

ls **

但是我不确定它到底输出了什么以及为什么会这样。

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

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

根据您使用的shell和设置,
**
可能等同于
*
;它可以匹配零个或多个字符,后跟零个或多个字符,这与只匹配一次零个或多个字符相同

但是对于某些shell,在某些设置下,
**
*
的递归版本,匹配当前目录和子目录中的所有文件和目录

引述:

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

仅当通过以下方式设置了
globstar
选项时,此选项才起作用:

shopt -s globstar
(默认情况下禁用)并且仅在相对较新版本的
bash
中使用

我相信zsh也支持这种语法


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

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

此行为不限于ls,称为“globbing”,它是基于与现有文件名匹配的模式扩展。需要注意的是,这些模式不使用正则表达式语法

shell在将参数发送到程序之前预处理这些参数。通常有多个级别的扩展,其中一些涉及全球化

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

最后,举一个简单的例子,说明这可以为您做些什么,特别是当与其他shell扩展产品(在本例中是由
bash
shell提供的)结合使用时。关于本例中使用的扩展的信息可以在-中找到,这是我的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
跳过这些选项时:

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
一个简单的例子,但如果您知道此行为不是特定于
ls
,那么您可以想象与
mv
cp
rsync
等结合使用时的实用程序 通过使用双星号(
**
),可以使用glob列出文件系统上的文件。glob是用于匹配文件路径的文本或通配符字符串。使用一个或多个glob来定位文件系统上的文件称为globbing

除了Linux shell之外,globbing还用于各种配置文件中,以指定要查找的文件列表。例如:
.gitignore
文件中要忽略的文件和文件夹、
文件
在Typescript项目中的
tsconfig.json
文件中包含
选项等

以下是全球化的一些最重要方面,双星号(
***
)就是其中之一:


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

示例:
Tests/HelloWorld.js

这里,
Tests
HelloWorld.js
是段,
/
是分隔符


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

示例:
*.js

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


双星号(
**
) 双星号(
**
)匹配多个段中的零个或多个字符。它用于全局绑定嵌套目录中的文件

示例:
Tests/***.js

这里,文件选择将限制在
Tests
目录。glob将匹配文件,如
测试/HelloWorld.js
测试/UI/HelloWorld.js
测试/UI/Feature1/HelloWorld.js


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

示例:
tests/?at.js

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


方括号(
[abc]
) 方括号(
[…]
)用方括号中提到的单个字符表示文件的全局

示例:
tests/[CB]at.js

此glob将匹配文件li
.
├── f
├── f.txt
└── x
    ├── f
    ├── f.txt
    └── y
        ├── f
        ├── f.txt
        └── z
            ├── f
            └── f.txt