首頁 > linux教程 > Linux文件和目錄管理 閱讀:0更新時間:2020-04-15 15:23:07

Linux命令行自動補全功能詳解(實例演示)

 文件名(或者目錄名)是執行 linux 命令中最常見的參數,例如前面介紹的 cd、mkdir、cp 等命令,都涉及到了文件名。然而對初學者來說,輸入完整的文件名感覺很麻煩,尤其面臨文件名(目錄名)特別長的時候。

考慮到這種情況,shell(Bash)提供了一種稱為“命令行自動補全”的功能,即在輸入文件名的時候,只需要輸入該文件名的前幾個字符,然后按 Tab 鍵,Shell 就可以自動將文件名補全。

舉個例子,在 /etc 目錄下,執行如下命令:

[root@localhost ~]# cd /etc
[root@localhost etc]# cd fs <-- 按一次 Tab 鍵

當按下 Tab 鍵時,你會發現 Shell 自動將 "fs" 補全成了 "fatab",這是因為當前 /etc 目錄中只有 fstab 是以 "fs" 開頭,因此 Shell 可以確定這里想要輸入的文件名稱為 fstab。

那么,如果當前目錄中含有多個以指定字符(或字符串)開頭的目錄或文件,Shell 還可以成功辨認嗎?答案是否定的,但它會以列表的形式給出所有以指定字符或字符串開頭的文件或目錄,供用戶選擇。

例如,還是在 /etc 目錄下,執行如下命令:

[root@localhost etc]# cd b <-- 連續按兩次 Tab 鍵
bash_completion.d/      blkid/          bonobo-activation/
bashrc                  bluetooth

可以看到,當按一次 Tab 鍵時,Shell 沒有任何反映,原因就是當前目錄下以 "b" 為開頭的文件或目錄有多個(2 個以上),僅憑一個字符 "b" 無法精準判斷出具體指的是哪個文件。而當再一次按下 Tab 鍵時,Shell 會列表的形式顯示給用戶當前目錄下所有以 "b" 開頭的文件或目錄。

事實上,Shell 提供的命令行補全功能不僅適用于補全文件名,也同樣適用于所有 Linux 命令。舉個例子,當輸入 ca 并連續按下 2 次 Tab 鍵時,Shell 會羅列出所有以 "ca" 開頭的 Linux 命令,如下所示:

[root@localhost etc]# ca <--連續按兩次 Tab 鍵
cacertdir_rehash    cache_restore       capsh       catchsegv
cache_check         cal                 captoinfo
cache_dump          caller              case
cache_repair        canberra-gtk-play   cat

另外,Shell 還有一套被稱作通配符的轉用符號(如表 1 所示),這些通配符可以搜索并匹配文件名的一部分,從而大大簡化了文件名的輸入。

表 1 Shell 通配符及其作用
符號 作用
* 匹配任意數量的字符。
? 匹配任意一個字符。
[] 匹配括號內的任意一個字符,甚至 [] 中還可以包含用 -(短橫線)連接的字符或數字,表示一定范圍內的字符或數字。


為了學習這些通配符的用法,首先需要建立一個空目錄(如 test),并在該目錄中創建一些文件(供測試用),執行命令如下:

[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


在此基礎上,繼續執行如下命令:

[root@localhost test]# ls a* <--匹配所有以 a 字符開頭的文件名
apple
[root@localhost test]# ls g*t <--匹配所有以 g 字符開頭,以 t 字符結尾的文件名
grapefruit
[root@localhost test]# ls *e* <--匹配所有包含 e 字符的文件名
apple grape grapefruit watermelon
[root@localhost test]# ls *n* <--匹配所有包含 n 字符的文件名
banana watermelon

結合以上實例,因為 * 可以匹配任何數量的字符,因此可以一一實現實例中標注的功能。

接下來,列舉一下使用 ? 匹配文件名的示例:

[root@localhost test]# ls ????e
apple grape
[root@localhost test]# ls g???e*
grape grapefruit

因為 1 個 ? 只能匹配 1 個任意字符,因此該示例中第一個例子表示的是匹配任意包含 5 個字符但以 e 結尾的文件(apple 和 grape),第二例子表示匹配任何以 g 開頭且第 5 個字符為 e 的文件(grape 和 grapefruit)。

最后,列舉一些使用括號 [] 匹配文件名的示例:

[root@localhost test]# ls [abw]*
apple banana watermelon
[root@localhost test]# ls [agw]*[ne]
apple grape watermelon

此示例中,第一個例子表示匹配任何以 a、b 或 w 開頭的文件;第二個例子中表示匹配任何以 a、g、w 開頭,以 n 或 e 結尾的文件名。

不僅如此,[] 中還可以通過 -(短橫線)表示一定范圍內的任意字符(或數字),例如:

[root@localhost test]# ls [a-g]*
apple banana grape grapefruit

其中,[a-g]* 表示匹配以字母 a 到  g 之間任何一個字母開頭的文件名。

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩