文件名(或者目錄名)是執(zhí)行 linux 命令中最常見(jiàn)的參數(shù),例如前面介紹的 cd、mkdir、cp 等命令,都涉及到了文件名。然而對(duì)初學(xué)者來(lái)說(shuō),輸入完整的文件名感覺(jué)很麻煩,尤其面臨文件名(目錄名)特別長(zhǎng)的時(shí)候。
考慮到這種情況,shell(Bash)提供了一種稱為“命令行自動(dòng)補(bǔ)全”的功能,即在輸入文件名的時(shí)候,只需要輸入該文件名的前幾個(gè)字符,然后按 Tab 鍵,Shell 就可以自動(dòng)將文件名補(bǔ)全。
舉個(gè)例子,在 /etc 目錄下,執(zhí)行如下命令:
[root@localhost ~]# cd /etc
[root@localhost etc]# cd fs <-- 按一次 Tab 鍵
當(dāng)按下 Tab 鍵時(shí),你會(huì)發(fā)現(xiàn) Shell 自動(dòng)將 "fs" 補(bǔ)全成了 "fatab",這是因?yàn)楫?dāng)前 /etc 目錄中只有 fstab 是以 "fs" 開(kāi)頭,因此 Shell 可以確定這里想要輸入的文件名稱為 fstab。
那么,如果當(dāng)前目錄中含有多個(gè)以指定字符(或字符串)開(kāi)頭的目錄或文件,Shell 還可以成功辨認(rèn)嗎?答案是否定的,但它會(huì)以列表的形式給出所有以指定字符或字符串開(kāi)頭的文件或目錄,供用戶選擇。
例如,還是在 /etc 目錄下,執(zhí)行如下命令:
[root@localhost etc]# cd b <-- 連續(xù)按兩次 Tab 鍵bash_completion.d/ blkid/ bonobo-activation/bashrc bluetooth
可以看到,當(dāng)按一次 Tab 鍵時(shí),Shell 沒(méi)有任何反映,原因就是當(dāng)前目錄下以 "b" 為開(kāi)頭的文件或目錄有多個(gè)(2 個(gè)以上),僅憑一個(gè)字符 "b" 無(wú)法精準(zhǔn)判斷出具體指的是哪個(gè)文件。而當(dāng)再一次按下 Tab 鍵時(shí),Shell 會(huì)列表的形式顯示給用戶當(dāng)前目錄下所有以 "b" 開(kāi)頭的文件或目錄。
事實(shí)上,Shell 提供的命令行補(bǔ)全功能不僅適用于補(bǔ)全文件名,也同樣適用于所有 Linux 命令。舉個(gè)例子,當(dāng)輸入 ca 并連續(xù)按下 2 次 Tab 鍵時(shí),Shell 會(huì)羅列出所有以 "ca" 開(kāi)頭的 Linux 命令,如下所示:
[root@localhost etc]# ca <--連續(xù)按兩次 Tab 鍵cacertdir_rehash cache_restore capsh catchsegvcache_check cal captoinfocache_dump caller casecache_repair canberra-gtk-play cat
另外,Shell 還有一套被稱作通配符的轉(zhuǎn)用符號(hào)(如表 1 所示),這些通配符可以搜索并匹配文件名的一部分,從而大大簡(jiǎn)化了文件名的輸入。
| 符號(hào) | 作用 |
|---|---|
| * | 匹配任意數(shù)量的字符。 |
| ? | 匹配任意一個(gè)字符。 |
| [] | 匹配括號(hào)內(nèi)的任意一個(gè)字符,甚至 [] 中還可以包含用 -(短橫線)連接的字符或數(shù)字,表示一定范圍內(nèi)的字符或數(shù)字。 |
為了學(xué)習(xí)這些通配符的用法,首先需要建立一個(gè)空目錄(如 test),并在該目錄中創(chuàng)建一些文件(供測(cè)試用),執(zhí)行命令如下:
[root@localhost etc]# makdir test
[root@localhost etc]# cd test
[root@localhost test]# touch apple banana grape grapefruit watermelon
[root@localhost test]# ls
apple banana grape grapefruit watermelon
在此基礎(chǔ)上,繼續(xù)執(zhí)行如下命令:
[root@localhost test]# ls a* <--匹配所有以 a 字符開(kāi)頭的文件名
apple
[root@localhost test]# ls g*t <--匹配所有以 g 字符開(kāi)頭,以 t 字符結(jié)尾的文件名
grapefruit
[root@localhost test]# ls *e* <--匹配所有包含 e 字符的文件名
apple grape grapefruit watermelon
[root@localhost test]# ls *n* <--匹配所有包含 n 字符的文件名
banana watermelon
結(jié)合以上實(shí)例,因?yàn)?* 可以匹配任何數(shù)量的字符,因此可以一一實(shí)現(xiàn)實(shí)例中標(biāo)注的功能。
接下來(lái),列舉一下使用 ? 匹配文件名的示例:
[root@localhost test]# ls ????e
apple grape
[root@localhost test]# ls g???e*
grape grapefruit
因?yàn)?1 個(gè) ? 只能匹配 1 個(gè)任意字符,因此該示例中第一個(gè)例子表示的是匹配任意包含 5 個(gè)字符但以 e 結(jié)尾的文件(apple 和 grape),第二例子表示匹配任何以 g 開(kāi)頭且第 5 個(gè)字符為 e 的文件(grape 和 grapefruit)。
最后,列舉一些使用括號(hào) [] 匹配文件名的示例:
[root@localhost test]# ls [abw]*
apple banana watermelon
[root@localhost test]# ls [agw]*[ne]
apple grape watermelon
此示例中,第一個(gè)例子表示匹配任何以 a、b 或 w 開(kāi)頭的文件;第二個(gè)例子中表示匹配任何以 a、g、w 開(kāi)頭,以 n 或 e 結(jié)尾的文件名。
不僅如此,[] 中還可以通過(guò) -(短橫線)表示一定范圍內(nèi)的任意字符(或數(shù)字),例如:
[root@localhost test]# ls [a-g]*
apple banana grape grapefruit
其中,[a-g]* 表示匹配以字母 a 到 g 之間任何一個(gè)字母開(kāi)頭的文件名。
新聞熱點(diǎn)
疑難解答
圖片精選