通配linux
方括號最簡單的用法就是通配。你可能在知道「工具
Globbing」這個概念以前就已經經過通配來匹配內容了,列出具備相同特徵的多個文件就是一個很常見的場景,例如列出全部 JPEG 文件:測試
ls *.jpg
使用通配符wildcard來獲得符合某個模式的全部內容,這個過程就叫通配。字符串
在上面的例子當中,星號(*)就表明「0 個或多個字符」。除此之外,還有表明「有且僅有一個字符」的問號(?)。所以get
ls d*k*
能夠列出 darkly 和 ducky,並且 dark 和 duck 也是能夠被列出的,由於 * 能夠匹配 0 個字符。而變量
ls d*k?
則只能列出 ducky,不會列出 darkly、dark 和 duck。file
方括號也能夠用於通配。爲了便於演示,能夠建立一個用於測試的目錄,並在這個目錄下建立文件:技巧
touch file0{0..9}{0..9}
執行上面這個命令以後,就會建立 file000、file00一、……、file099 這 100 個文件。touch
若是要列出這些文件當中第二位數字是 7 或 8 的文件,能夠執行:db
ls file0[78]?
若是要列出 file02二、file02七、file02八、file05二、file05七、file05八、file09二、file09七、file098,能夠執行:
ls file0[259][278]
固然,不單單是 ls,不少其它的命令行工具均可以使用方括號來進行通配操做。但在刪除文件、移動文件、複製文件的過程當中使用通配,你須要有一點橫向思惟。
例如將 file010 到 file029 這 30 個文件複製成 archive010 到 archive029 這 30 個副本,不能夠這樣執行:
cp file0[12]? archive0[12]?
由於通配只能針對已有的文件,而 archive 開頭的文件並不存在,不能進行通配。
而這條命令
cp file0[12]? archive0[1..2][0..9]
也一樣不行,由於 cp 並不容許將多個文件複製到多個文件。在複製多個文件的狀況下,只能將多個文件複製到一個指定的目錄下:
mkdir archive cp file0[12]? archive
這條命令是能夠正常運行的,但它只會把這 30 個文件以一樣的名稱複製到 archive/ 目錄下,而這並非咱們想要的效果。
若是你閱讀過我關於花括號的文章,你大概會記得可使用 % 來截掉字符串的末尾部分,而使用 # 則能夠截掉字符串的開頭部分。
例如:
myvar="Hello World" echo Goodbye Cruel ${myvar#Hello}
就會輸出 Goodbye Cruel World,由於 #Hello 將 myvar 變量中開頭的 Hello 去掉了。
在通配的過程當中,也可使用這一個技巧。
for i in file0[12]?;\ do\ cp $i archive${i#file};\ done
上面的第一行命令告訴 Bash 須要對全部 file01 開頭或者 file02 開頭,且後面只跟一個任意字符的文件進行操做,第二行的 do 和第四行的 done 表明須要對這些文件都執行這一塊中的命令。
第三行就是實際的複製操做了,這裏使用了兩次 $i 變量:第一次在 cp 命令中直接做爲源文件的文件名使用,第二次則是截掉文件名開頭的 file 部分,而後在開頭補上一個 archive,也就是這樣:
"archive" + "file019" - "file" = "archive019"
最終整個 cp 命令展開爲:
cp file019 archive019
最後,順帶說明一下反斜槓 \ 的做用是將一條長命令拆分紅多行,這樣能夠方便閱讀。
在下一節,咱們會了解方括號的更多用法,敬請關注。