glob 模式(globbing)也被稱之為 shell 通配符,名字的起源來自於 Unix V6 中的 /etc/glob (詳見 man 文檔)。glob 是一種特殊的模式匹配,最常見的是通配符拓展,也可以將 glob 模式設為精簡了的正則表達式,在最新的 CentOS 7 中已經刪除了 glo... ...
概念
glob 模式(globbing)也被稱之為 shell 通配符,名字的起源來自於 Unix V6 中的 /etc/glob (詳見 man 文檔)。glob 是一種特殊的模式匹配,最常見的是通配符拓展,也可以將 glob 模式設為精簡了的正則表達式,在最新的 CentOS 7 中已經刪除了 glob 的相關描述文檔,刪除的原因由於 glob 已經整合到了 shell 之中,然後就有了 shell 通配符。
筆者在查閱資料的時候發現關於 glob 模式或者 globbing 的相關描述以及文檔是少之又少,所以特地在這裡整理一下並重新寫一寫使用方法
shell 通配符 / glob 模式通常用來匹配目錄以及文件,而不是文本!!!
shell 通配符 / glob 模式通常用來匹配目錄以及文件,而不是文本!!!
shell 通配符 / glob 模式通常用來匹配目錄以及文件,而不是文本!!!
語法
字元 | 解釋 |
---|---|
* | 匹配任意長度任意字元 |
? | 匹配任意單個字元 |
[list] | 匹配指定範圍內(list)任意單個字元,也可以是單個字元組成的集合 |
[^list] | 匹配指定範圍外的任意單個字元或字元集合 |
[!list] | 同[^list] |
{str1,str2,...} | 匹配 srt1 或者 srt2 或者更多字元串,也可以是集合 |
專用字元集
字元 | 意義 |
---|---|
[:alnum:] | 任意數字或者字母 |
[:alpha:] | 任意字母 |
[:space:] | 空格 |
[:lower:] | 小寫字母 |
[:digit:] | 任意數字 |
[:upper:] | 任意大寫字母 |
[:cntrl:] | 控制符 |
[:graph:] | 圖形 |
[:print:] | 可列印字元 |
[:punct:] | 標點符號 |
[:xdigit:] | 十六進位數 |
[:blank:] | 空白字元(未驗證) |
註
在使用通配符的過程中可能會遇到文件名中包含了特殊字元的情況,例如
bash$:ls
a\b a[123]b A[abc]123 abc!123
a 12 b #這是一個文件
在不使用專用字元集的情況下,需要使用轉義符來匹配,或者使用單引號將其框選。
這裡將 Linux shell 元字元列出,在使用通配符時如果沒有進行轉義可能就會被辨識為元字元
字元 | 作用 |
---|---|
IFS | 由 < space > 或 < tab > 或 < enter > 三者之一組成 |
CR | 由 < enter > 產生 |
= | 設定變數 |
$ | 作變數或運算替換 |
> | 重導向標準輸出 |
< | 重導向標準輸入 |
\ | |
& | 重導向文件描述符,或將命令靜默執行 |
( ) | 將其內的命令置於 nested subshell 執行,或用於運算或命令替換 |
{ } | 將其內的命令置於 non-named function 中執行,或用在變數替換的界定範圍 |
; | 在前一個命令結束時,而忽略其返回值,繼續執行下一個命令 |
&& | 在前一個命令結束時,若返回值為 true,繼續執行下一個命令 |
\ | \ |
! | 執行 history 中的命令 |
第六行與倒數第二行居然錯誤了,看來博客園對 Markdown 的支持有待改進
第六行內容:“ | ”命令管線
倒數第二行內容:“ \ ” 在前一個命令結束時,若返回值為 false,繼續執行下一個命令
示例
這裡使用 /etc 下的文件為例
匹配以 a開頭,中間包含任意數量數字的文件
ls a*[0-9]*
#當然你是找不到的,因為通常情況下 /etc 下沒有以數字開頭的文件
匹配以任意小寫字母開頭,中間包含數字的文件
ls [[:lower:]]*[0-9]*
#相信你已經看到了一些文件,我們繼續
列出所有文件中以 init 開頭,英文結尾的文件
ls init*[a-z]
列出以 au,b,c 開頭的文件
ls {"au",[bc]}*
更多的實例可以通過搜索引擎找到,這裡就不多說了
註意事項
- 在使用專屬字元集的時候,字元集之外還需要用 [ ] 來包含住,否則專用字元集不會生效,例如 [[:space:]]
- 想要轉義的時候,單引號與雙引號使用方法是不同的,單引號會轉義所有字元,而且單引號中間不允許再出現單引號,雙引號允許出現特定的 shell 元字元,具體字元可以自行查詢
- 在使用花括弧 {} 的時候,裡面的單個字元串需要使用單引號或者雙引號括住,否則就會視為多個的單個字元