![使用大括号扩展](https://linux22.com/image/95193/%E4%BD%BF%E7%94%A8%E5%A4%A7%E6%8B%AC%E5%8F%B7%E6%89%A9%E5%B1%95.png)
所以基本上我想将这两个命令行添加在一起
ls *[Aa]*
ls *[Bb]*
我正在寻找一个包含 A 和 B(小写或大写)的文件,并且它们可以出现多次。
这是我尝试过的:
ls *[Aa]*&&*[Bb]*
答案1
使用大括号扩展
一种方法是使用大括号扩展。让我们考虑一个包含这些文件的目录:
$ ls
1a2a3 1a2b3 1b2A3 1b2b3
a
要选择同时具有和的选项b
:
$ ls *{[bB]*[aA],[aA]*[bB]}*
1a2b3 1b2A3
改进
一个可能的问题是,如果选项之一没有匹配的文件,大括号扩展的行为方式。考虑一个包含这些文件的目录:
$ ls
1a2a3 1b2A3 1b2b3
现在,让我们运行我们的命令:
$ ls *{[bB]*[aA],[aA]*[bB]}*
ls: cannot access '*[aA]*[bB]*': No such file or directory
1b2A3
如果我们不喜欢这个警告消息,我们可以设置 nullglob,它就会消失:
$ shopt -s nullglob
$ ls *{[bB]*[aA],[aA]*[bB]}*
1b2A3
但这种方法的一个限制是,如果两个 glob 都不匹配,ls
则不带参数运行,因此它将列出所有文件。
使用扩展的 glob
让我们再次考虑包含这些文件的目录:
$ ls
1a2a3 1a2b3 1b2A3 1b2b3
现在,让我们设置extglob
:
$ shopt -s extglob
并且,让我们使用扩展的 glob 来查找我们的文件:
$ ls *@([bB]*[aA]|[aA]*[bB])*
1a2b3 1b2A3
答案2
如果你不介意grep
寻求帮助的话
ls *[aA]* | grep -i b
也会做的。