Bash glob,如何对非单位长度的字符串进行或运算?

Bash glob, how to OR over strings of non unit length?

我在一个目录中有一堆文件。每个文件的基本名称都以两位数字和一个字母结尾,例如 file_01A.txt、file_03B.txt、file_13A.txt.

在使用 bash 的终端中(我假设,在 mac osx 上工作)我使用

ls *01*[AB]*.txt

returns 01A、01B等所有文件。这对我来说很有意义。

ls *02*[AB]*.txt

returns 02A、02B等所有文件类似。

现在我想 return 所有文件 01A、01B、02A、02B。因此我想要这样的东西:

ls *(01 or 02)*[AB]*.txt

尝试 1:我尝试使用 | 但会引发错误。

尝试 2:ls *[01,02]*[AB]*.tex 但这也给出了 03 文件,因为我假设它将 01 和 02 解释为单独的匹配项。

尝试 3:ls *["01","02"]*[AB]*.tex 还是一样。

表达符合您要求的单个通配符并不难。

ls *0[12]*[AB]*.tex

在一般情况下,如果您无法表达单个通配符,请使用多个通配符。请注意,shell 按照您编写它们的顺序展开它们,如果它们都匹配某些文件,则展开中会有重复。

ls *01*[AB]*.tex *02*[AB]*.tex

您似乎对元字符的含义感到困惑。 * 匹配任意字符串,? 匹配任意字符,[abc] 匹配方括号中的任意一个字符。 [!abc] 监视一个非 abc 的单个字符。 Bash 还支持一种称为大括号扩展的扩展,其中 foo{bar,quux} 基本上是 foobar fooquux 的缩写。因此,您的尝试可以重新表述为

ls *{01,02}*[AB].tex

虽然重复的前缀0明显是多余的,最好放在大括号外面,然后你还不如换回方括号。

还有一个单独的扩展通配符语法,允许使用更复杂的通配符。有关详细信息,请参阅 reference manual