使用大括号扩展

使用大括号扩展

所以基本上我想将这两个命令行添加在一起

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

也会做的。

相关内容