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
命令本身不会看到*
字符; 它只能看到扩展的文件列表,就像您在命令行上输入了整个列表一样.
Yog*_*ity 70
通过使用双星号 ( **
),您可以使用glob列出文件系统上的文件。glob 是用于匹配文件路径的文字或通配符字符串。使用一个或多个glob来定位文件系统上的文件称为globbing。
除了 Linux shells,在各种配置文件中也使用 globbing 来指定要定位的文件列表。例如:文件中要忽略的文件和文件夹.gitignore
,files
以及Typescript 项目include
中tsconfig.json
文件中的选项等。
以下是通配符的一些最重要的方面,双星号 ( **
) 就是其中之一:
/
)分隔符始终是/
字符。段是两个分隔符之间的所有内容。
例子: Tests/HelloWorld.js
这里, Tests
andHelloWorld.js
是段, and/
是分隔符。
*
)单个星号 ( *
) 匹配一个段中的零个或多个字符。它用于对一个目录中的文件进行通配。
例子: *.js
此 glob 将匹配文件,例如HelloWorld.js
但不匹配文件,例如Tests/HelloWorld.js
或Tests/UI/HelloWorld.js
**
)双星号 ( **
) 匹配多个段中的零个或多个字符。它用于对嵌套目录中的文件进行通配。
例子: Tests/**/*.js
在这里,文件选择将被限制在Tests
目录中。glob 将匹配诸如Tests/HelloWorld.js
, Tests/UI/HelloWorld.js
,之类的文件Tests/UI/Feature1/HelloWorld.js
。
?
)问号( ?
) 匹配一个段中的单个字符。当某些文件或目录的名称仅相差一个字符时,您可以使用?
.
例子: tests/?at.js
这将匹配文件,如tests/cat.js
,test/Cat.js
,test/bat.js
等
[abc]
)方括号 ( [...]
) 将文件与方括号中提到的单个字符连接起来。
例子: tests/[CB]at.js
这个 glob 将匹配文件,如tests/Cat.js
或tests/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
目录中排除所有文件和文件夹。
就是这样!希望有帮助!
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 |
? | ? |
其他答案已经很好地涵盖了这个特定通配符的确切行为,但有关一般情况的信息可能很有用.
此行为不限于ls
,并且被称为"globbing",它是基于与现有文件名匹配的模式扩展.请务必注意,这些模式不使用正则表达式语法.
shell在将参数发送到程序之前对其进行预处理.通常有多个级别的扩展,其中一些涉及通配.
有关文件glob模式中可用的其他通配符的更多信息的一个很好的资源是unix手册页.可以在这里找到glob的在线版本.
最后,一个简单的例子说明这可以为你做什么,特别是当与其他shell扩展好东西结合使用时,在这种情况下由bash
shell 提供.有关此示例中使用的扩展的信息可以在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
,等.