Linux 通配符完全指南:從基礎語法到實戰應用
在文件操作章節中,我們學習了一些實用命令,但它們一次只能操作單個文件,效率不高。現在我將介紹一種批量處理文件的方法。
什么是通配符?
通配符是一組規則符號,用于創建定義文件或目錄集合的模式。正如你所知,在命令行中引用文件或目錄時,實際是在引用路徑。而在路徑中使用通配符,可以將其轉換為一組文件或目錄。
基本通配符集合:
- *:匹配零個或多個字符
- ?:匹配單個字符
- []:匹配范圍內的單個字符
基礎示例
以*為例,以下命令將列出所有以字母b開頭的條目:
pwd
/home/ryan/linuxtutorialwork
ls
barry.txt blah.txt bob example.png firstfile foo1 foo2
foo3 frog.png secondfile thirdfile video.mpeg
ls b*
barry.txt blah.txt bob
底層原理
這里的機制很有趣:你可能以為ls命令會直接處理b*參數,但實際上是bash(提供命令行界面的程序)完成了模式匹配。當輸入包含通配符的命令時,系統會先將模式替換為所有匹配的文件或目錄路徑,再執行命令。例如:
# 輸入命令
ls b*
# 系統轉換為
ls barry.txt blah.txt bob
# 再執行程序
因此,通配符可在任何命令行中使用,不受程序限制。
更多示例
假設當前目錄為linuxtutorialwork,且包含上述文件,以下是通配符的應用場景:
(1) 匹配所有.txt后綴文件(絕對路徑)
ls /home/ryan/linuxtutorialwork/*.txt
/home/ryan/linuxtutorialwork/barry.txt /home/ryan/linuxtutorialwork/blah.txt
(2) 匹配第二個字母為i的文件(?通配符)
ls ?i*
firstfile video.mpeg
(3) 匹配三字母后綴的文件(.???)
ls *.???
barry.txt blah.txt example.png frog.png
注意:video.mpeg后綴為.mpeg,四字母,不匹配
(4) 匹配以s或v開頭的文件([]范圍匹配)
ls [sv]*
secondfile video.mpeg
(5) 匹配包含數字的文件([0-9]范圍)
ls *[0-9]*
foo1 foo2 foo3
(6) 匹配非a-k開頭的文件([^]取反)
ls [^a-k]*
secondfile thirdfile video.mpeg
實際應用場景
通配符的用途極為廣泛,以下是幾個典型案例:
(1) 查看目錄中所有文件的類型
file /home/ryan/*
bin: directory
Documents: directory
frog.png: PNG image data
public_html: directory
(2) 將所有jpg/png圖片移動到指定目錄
mv public_html/*.??g public_html/images/
(3) 查看所有用戶家目錄中的.bash_history文件
ls -lh /home/*/.bash_history
-rw------- 1 harry users 2.7K Jan 4 07:32 /home/harry/.bash_history
-rw------- 1 ryan users 3.1K Jun 12 21:16 /home/ryan/.bash_history