文件通配:将 *[Aa]* 和 *[Bb]* 加在一起

epi*_*ish 4 command-line files

所以基本上我想把这两条 cmd 行加在一起

ls *[Aa]* 
ls *[Bb]*
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个同时包含 A 和 B(小写或大写)的文件,它们可以出现多次。

这是我尝试过的:

ls *[Aa]*&&*[Bb]*
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 6

使用大括号扩展

一种方法是使用大括号扩展。让我们考虑一个包含这些文件的目录:

$ ls
1a2a3  1a2b3  1b2A3  1b2b3
Run Code Online (Sandbox Code Playgroud)

要选择同时具有ab两种情况的那些:

$ ls *{[bB]*[aA],[aA]*[bB]}*
1a2b3  1b2A3
Run Code Online (Sandbox Code Playgroud)

改进

一个可能的问题是如果选项之一没有匹配的文件,大括号扩展的行为方式。考虑一个包含这些文件的目录:

$ ls
1a2a3  1b2A3  1b2b3
Run Code Online (Sandbox Code Playgroud)

现在,让我们运行我们的命令:

$ ls *{[bB]*[aA],[aA]*[bB]}*
ls: cannot access '*[aA]*[bB]*': No such file or directory
1b2A3
Run Code Online (Sandbox Code Playgroud)

如果我们不喜欢该警告消息,我们可以设置 nullglob,它就会消失:

$ shopt -s nullglob
$ ls *{[bB]*[aA],[aA]*[bB]}*
1b2A3
Run Code Online (Sandbox Code Playgroud)

但是,这种方法的一个限制是,如果两个 glob 都不匹配,则不ls带参数运行,因此它将列出所有文件。

使用扩展的 glob

让我们再次考虑包含这些文件的目录:

$ ls
1a2a3  1a2b3  1b2A3  1b2b3
Run Code Online (Sandbox Code Playgroud)

现在,让我们设置extglob

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

而且,让我们使用扩展的 glob 来查找我们的文件:

$ ls *@([bB]*[aA]|[aA]*[bB])*
1a2b3  1b2A3
Run Code Online (Sandbox Code Playgroud)

  • 以免有人认为括号扩展是解决全局问题的魔杖,您可能应该解释一下您的答案等价于 `ls *[bB]*[aA]* *[aA]*[bB]*` — 只是一个 glob 查找包含 `B` 然后是 `A` 的文件,另一个查找包含 `A` 然后是 `B` 的文件。(1) 大括号版本甚至不比简单的命令短。(2) 如果有任何文件的名称包含'A'和'B'的交替序列,例如'baby'或'cabstand',它们将被列出两次。 (3认同)