【发布时间】:2021-09-05 16:50:41
【问题描述】:
我在一个目录中有一堆文件。每个文件的基本名称以两位数字和一个字母结尾,例如 file_01A.txt、file_03B.txt、file_13A.txt。
在使用 bash 的终端中(我假设,在 mac osx 上工作)我使用
ls *01*[AB]*.txt
返回所有文件,例如 01A 和 01B。这对我来说很有意义。
ls *02*[AB]*.txt
类似地返回所有文件,例如 02A 和 02B。
现在我想返回所有文件 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 -
ls *02*[AB]*.txt将匹配名为abc02_A_325.txt的文件,而ls *_01[AB].txt将匹配限制为file_01A.txt;对于具体问题ls *_0[12][AB].txt -
“bash 正则表达式”类似于
[[ $name =~ (01|02}.*[AB].* ]]。您的问题是关于 glob 表达式,这是另一回事。 -
您更有可能在 Mac 上使用 zsh,而不是 bash。
-
[12]的工作方式与[AB]的工作方式相同。您也可以使用逗号和|s,但不是您尝试的方式。几个例子:(a)*0[12]*[AB]*(b)*0{1,2}*{A,B}*(c)*0@(1|2)*@(A|B)*