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]
监视一个非 a
、b
或 c
的单个字符。 Bash 还支持一种称为大括号扩展的扩展,其中 foo{bar,quux}
基本上是 foobar fooquux
的缩写。因此,您的尝试可以重新表述为
ls *{01,02}*[AB].tex
虽然重复的前缀0
明显是多余的,最好放在大括号外面,然后你还不如换回方括号。
还有一个单独的扩展通配符语法,允许使用更复杂的通配符。有关详细信息,请参阅 reference manual。
我在一个目录中有一堆文件。每个文件的基本名称都以两位数字和一个字母结尾,例如 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]
监视一个非 a
、b
或 c
的单个字符。 Bash 还支持一种称为大括号扩展的扩展,其中 foo{bar,quux}
基本上是 foobar fooquux
的缩写。因此,您的尝试可以重新表述为
ls *{01,02}*[AB].tex
虽然重复的前缀0
明显是多余的,最好放在大括号外面,然后你还不如换回方括号。
还有一个单独的扩展通配符语法,允许使用更复杂的通配符。有关详细信息,请参阅 reference manual。