在一個 glob 中使用多個通配符

在一個 glob 中使用多個通配符

在我的目錄中,我有一個具有不同擴展名的檔案列表,例如

file-abc-12.out
file-abc-12.csv
file-abc-12.txt
file-xyz-12.out
file-xyz-12.csv
file-xyz-12.txt
file-abc-04.out
file-abc-04.csv
file-abc-04.txt
file-xyz-04.out
file-xyz-04.csv
file-xyz-04.txt

如果我只想列出包含 abc 並以 .out 結尾的文件,我該怎麼做。我想使用兩個模式匹配搜尋和 來執行 als或 a 。我只知道如何一次搜尋其中一個,我如何讓它搜尋具有這兩種條件的檔案名稱?find*abc**out

答案1

這會給你你想要的:

$ find . -name '*abc*' -o -name '*out'

答案2

我將問題中使用的“和”解釋為嚴格的“邏輯與”,即“查找名稱匹配的文件”兩個都 *abc**out」。

您可以在一個檔案名稱通配模式中使用多個通配符:

$ ls *abc*out

或者

$ find . -type f -name "*abc*out"

例如。

該模式將匹配包含該字串並以 結尾的*abc*out任何名稱。abcout

如果沒有文件與該模式匹配,則該模式將保持未展開狀態。如果發生這種情況,ls將獲取模式*abc*out作為參數而不是有效的文件名,並會抱怨ls: cannot access *abc*out: No such file or directory.

若要bash顯示有關無法擴充檔案通配模式的錯誤,而不是將未擴充的模式傳遞給ls,請設定failglobshell 選項:

bash-4.4$ ls *abc*out
ls: *abc*out: No such file or directory

bash-4.4$ shopt -s failglob

bash-4.4$ ls *abc*out
bash: no match: *abc*out

答案3

我發現對我有用的解決方案涉及使用 grep。它跟隨:

$ ls *out | grep "abc"

相關內容