Linux萬用字元詳解

2021-06-28 20:50:21 字數 2571 閱讀 6658

在您日常的 linux 使用中,有很多時候您可能需要一次對多個檔案系統物件執行單一操作(比如 rm)。在這些

情況下,在命令列中輸入許多檔案通常讓人感到厭煩:

$ rm file1 file2 file3 file4 file5 file6 file7 file8

為了解決這個問題,您可以利用 linux 內建的萬用字元支援。這種支援也叫做「globbing」(由於歷史原因),

允許您通過使用萬用字元模式一次指定多個檔案。bash 和其它 linux 命令將通過在磁碟上查詢並找到任何與之

匹配的檔案來解釋這種模式。因此,如果在當前工作目錄中,您有從 file1 到 file8 的檔案,那麼您可以輸入下

面的命令來刪除這些檔案:

$ rm file[1-8]

或者,如果您只想要刪除檔名以 file 開頭的所有檔案,您可以輸入:

$ rm file*

或者,如果您想要列出 /etc 中以 g 開頭的所有檔案系統物件,您可以輸入:

$ ls -d /etc/g*

/etc/gconf /etc/ggi /etc/gimp /etc/gnome /etc/gnome-vfs-mime-magic /etc/gpm /etc/group /etc/group-

現在,如果您指定了沒有任何檔案系統物件與之匹配的模式,會怎麼樣呢?在下面的示例中,我們試圖列出

/usr/bin 中以 asdf 開頭並且以 jkl 結尾的所有檔案:

$ ls -d /usr/bin/asdf*jkl

ls: /usr/bin/asdf*jkl: no such file or directory

這裡是對所發生情況的說明。通常,當我們指定一種模式時,該模式與底層系統上的乙個或多個檔案匹配,

bash 以空格隔開的所有匹配物件的列表來替換該模式。但是,當模式不能找到匹配物件時,bash 將不理會參

數、萬用字元等等,保留原樣。因此,當「ls」不能找到檔案 /usr/bin/asdf*jkl 時,它會報錯。此處的有效的規則

是:glob 模式只在與檔案系統中的物件匹配時才可以進行擴充套件。

既然我們理解了 globbing 如何工作,我們來複習一下萬用字元語法。您可以使用幾個用於萬用字元擴充套件的專門的字

符;這裡有乙個: *

* 將與零個或多個字元匹配。這就是說「什麼都可以」。例子:

/etc/g* 與 /etc 中以 g 開頭的所有檔案匹配。

/tmp/my*1 與 /tmp 中以 my 開頭,並且以 1 結尾的所有檔案匹配。

? 與任何單個字元匹配。例子:

myfile? 與檔名為 myfile 後跟單個字元的任何檔案匹配。

/tmp/notes?txt 將與 /tmp/notes.txt 和 /tmp/notes_txt 都匹配,如果它們存在。

該萬用字元與 ? 相似,但允許指定得更確切。要使用該萬用字元,把您想要匹配的所有字元放在 內。結果的表達

式將與 中任一字元相匹配。您也可以用 - 來指定範圍,甚至還可以組合範圍。例子:

myfile[12] 將與 myfile1 和 myfile2 匹配。只要當前目錄中至少有乙個這樣的檔案存在,該萬用字元就可以進行擴 展。

[cc]hange[ll]og 將與 changelog、changelog、changelog 以及 changelog 匹配。您可以看到,與大寫形式

的變形匹配時,使用括弧萬用字元很有用。

ls /etc/[0-9]* 將列出 /etc 中以數字開頭的所有檔案。

ls /tmp/[a-za-z]* 將列出 /tmp 中以大寫字母或小寫字母開頭的所有檔案。

[!]

除了不與括弧中的任何字元匹配外,[!] 構造與 構造類似,只要不是列在 [! 和 ] 之間的字元,它將與任何字元

匹配。例子:

rm myfile[!9] 將刪除除 myfile9 之外的名為 myfile 加乙個字元的所有檔案。

這裡有一些使用萬用字元時應該注意的告誡說明。由於 bash 對與萬用字元相關的字元(?、[、]、*)進行特別處理

,因此您將包含這些字元的引數輸入到命令中時,需要特別小心。例如,如果您想要建立乙個包含字串 [fo]*

的檔案,下面這個命令可能不會執行您想要做的事:

$ echo [fo]* > /tmp/mynewfile.txt

如果 [fo]* 這個模式與當前工作目錄中的任何檔案匹配,那麼您將在 /tmp/mynewfile.txt 內發現那些檔案的名稱

,而不是您所期望的文字 [fo]*。解決方法是什麼呢?嗯,一種方法是用單引號把這些字元括起來,這將告訴

bash 單純地執行,而不會對其進行萬用字元擴充套件:

$ echo '[fo]*' > /tmp/mynewfile.txt

採用這種方法,您的新檔案將包含所期望的文字的 [fo]*。另一種方法是,您可以使用反斜槓,告訴 bash [、]

和 * 應該被當成文書處理,而不是被當成萬用字元處理:

$ echo \[fo\]\* > /tmp/mynewfile.txt

兩種方法都能同樣地起作用。既然我們談到反斜槓擴充套件,那麼現在是時候提一提了,為了指定文字 \,您可以

將它放入單引號中,或者也可以輸入 \\(它將被擴充套件為 \)。

linux 萬用字元詳解及總結

本部落格主要詳解關於linux中常使用的萬用字元的知識點,主要分為三個步驟 萬用字元 和 的詳細解釋 舉例截圖說明 個人的總結理解 一 萬用字元 和 的詳細解釋 ps 因為萬用字元 中可新增很多變數,所以這裡我會簡單舉出幾個例子來說明,其他情況請模擬 萬用字元 代表0到無窮多個任意字元 萬用字元 代...

Linux萬用字元知識深度實踐詳解

注意 linux萬用字元和三劍客 grep awk sed 正規表示式是不一樣的,因此,代表的意義也有較大的區別。萬用字元一般使用者命令列bash環境,而linux正規表示式用於grep sed awk場景。代表所有 0到多個 字元 萬用字元,代表1個字元 連續不同命令的分隔符 配置檔案注釋 管道 ...

Linux萬用字元

在使用shell命令對多個檔案物件執行單一操作時,例如刪除當前目錄下的file1到file8,多次使用相同的命令rm file1到rm file8非常麻煩,通常使用萬用字元模式解決這個問題 rm file 1 8 當使用萬用字元指定一種模式時,該模式與底層系統上的乙個或多個檔案匹配,shell以空格...