![bash--[字符] 的通配符](https://linux22.com/image/1204158/bash--%5B%E5%AD%97%E7%AC%A6%5D%20%E7%9A%84%E9%80%9A%E9%85%8D%E7%AC%A6.png)
有没有办法使用[characters]
,例如[:upper:]
,就像它们是通配符一样?例如,假设我有一个包含以下文件的目录:
AAA
AA
aaa
aa
BBB
BB
bbb
bb
现在假设我想要ls
所有以至少两个小写字母开头的文件。有没有ls [[:lower]][[:lower:]]*
更有效的方法来做到这一点,本质上就是“通配符数[[:lower:]]
,然后是通配符?”
另外,为什么不只是以两个小写字母开头,而是仅以两个小写字母开头,而不是 * 小写字母?(即?
而不是*
)?谢谢
答案1
你可以使用扩展通配符:
如果
extglob
使用内置命令启用了 shell 选项shopt
,则可以识别几个扩展的模式匹配运算符。在下面的描述中,模式列表是一个或多个模式的列表,以“|
”分隔。复合模式可以使用以下一个或多个子模式形成:(?(模式列表)
匹配零次或一次给定的模式。*(模式列表)
匹配零次或多次给定的模式。+(模式列表)
匹配给定模式的一个或多个出现。@(模式列表)
匹配给定的模式之一。!(模式列表)
匹配除给定模式之一之外的任意内容。
至于你问的问题,我无法理解这一点:
...所有以至少两个小写字母开头的文件...“[[:lower:]] 的通配符数,然后是通配符?”
通配符匹配零个或多个,这与两个或多个不同。[[:lower:]]
可以使用扩展的 glob 匹配任意数量的 s *([[:lower:]])
。“至少两个”根本不需要扩展的 glob [[:lower:]][[:lower:]]*
:。
... 仅以 2 个小写字母开头,而不是 * 小写字母
[[:lower:]][[:lower:]]?([^[:lower:]]*)
它是两个小写字符,后面可选跟着(除小写字符之外的任意字符和任何内容)。