epi*_*ish 4 command-line files
所以基本上我想把这两条 cmd 行加在一起
ls *[Aa]*
ls *[Bb]*
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个同时包含 A 和 B(小写或大写)的文件,它们可以出现多次。
这是我尝试过的:
ls *[Aa]*&&*[Bb]*
Run Code Online (Sandbox Code Playgroud)
一种方法是使用大括号扩展。让我们考虑一个包含这些文件的目录:
$ ls
1a2a3 1a2b3 1b2A3 1b2b3
Run Code Online (Sandbox Code Playgroud)
要选择同时具有a
和b
两种情况的那些:
$ ls *{[bB]*[aA],[aA]*[bB]}*
1a2b3 1b2A3
Run Code Online (Sandbox Code Playgroud)
一个可能的问题是如果选项之一没有匹配的文件,大括号扩展的行为方式。考虑一个包含这些文件的目录:
$ ls
1a2a3 1b2A3 1b2b3
Run Code Online (Sandbox Code Playgroud)
现在,让我们运行我们的命令:
$ ls *{[bB]*[aA],[aA]*[bB]}*
ls: cannot access '*[aA]*[bB]*': No such file or directory
1b2A3
Run Code Online (Sandbox Code Playgroud)
如果我们不喜欢该警告消息,我们可以设置 nullglob,它就会消失:
$ shopt -s nullglob
$ ls *{[bB]*[aA],[aA]*[bB]}*
1b2A3
Run Code Online (Sandbox Code Playgroud)
但是,这种方法的一个限制是,如果两个 glob 都不匹配,则不ls
带参数运行,因此它将列出所有文件。
让我们再次考虑包含这些文件的目录:
$ ls
1a2a3 1a2b3 1b2A3 1b2b3
Run Code Online (Sandbox Code Playgroud)
现在,让我们设置extglob
:
$ shopt -s extglob
Run Code Online (Sandbox Code Playgroud)
而且,让我们使用扩展的 glob 来查找我们的文件:
$ ls *@([bB]*[aA]|[aA]*[bB])*
1a2b3 1b2A3
Run Code Online (Sandbox Code Playgroud)