概念
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,繼續執行下一個命令 |
| || | 在前一個命令結束時,若返回值為 false,繼續執行下一個命令 |
| ! | 執行 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 元字符,具體字符可以自行查詢
- 在使用花括號 {} 的時候,里面的單個字符串需要使用單引號或者雙引號括住,否則就會視為多個的單個字符
