使用大括號擴展

使用大括號擴展

所以基本上我想將這兩個命令列添加在一起

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

也會做的。

相關內容