
所以基本上我想將這兩個命令列添加在一起
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
也會做的。