bash常用通配符的使用
一、前言
在 Linux Shell 編程和日常使用中,通配符(Wildcards) 是 Bash 提供的一種強(qiáng)大機(jī)制,用于匹配文件名、路徑、參數(shù)等,極大提升了命令行操作的效率。
本文將帶你全面了解 Bash 中常用的通配符,包括:
? 通配符的基本概念
? 常用通配符(如 *
, ?
, []
, {}
)的使用方法
? 通配符在命令行與腳本中的應(yīng)用
? 通配符與正則表達(dá)式的區(qū)別
? 實(shí)戰(zhàn)案例:批量操作文件、日志處理、自動(dòng)化腳本
? 常見(jiàn)問(wèn)題與解決方案
并通過(guò)完整示例幫助你快速掌握 Bash 通配符的使用與技巧。
二、什么是通配符?
通配符(Wildcard) 是 Bash 中用于模式匹配的特殊字符,主要用于匹配文件名或路徑名。它們通常用于 ls
、cp
、rm
、mv
、find
等命令中,幫助用戶快速操作多個(gè)文件。
三、Bash 中常用的通配符一覽
通配符 | 含義 | 示例 |
---|---|---|
* | 匹配任意數(shù)量的任意字符 | *.txt → 匹配所有 .txt 文件 |
? | 匹配任意一個(gè)字符 | file?.txt → 匹配 file1.txt, fileA.txt |
[] | 匹配括號(hào)中的任意一個(gè)字符 | [abc] → 匹配 a、b 或 c |
[!] 或 [^] | 匹配不在括號(hào)中的字符 | [!a-z] → 匹配非小寫(xiě)字母 |
{} | 匹配多個(gè)指定的字符串 | file{1,2,3}.txt → 匹配 file1.txt, file2.txt, file3.txt |
**(擴(kuò)展) | 遞歸匹配目錄(需啟用 shopt -s globstar) | **/*.txt → 匹配所有子目錄下的 .txt 文件 |
四、通配符詳解與使用示例
? 1.*—— 匹配任意數(shù)量的字符
$ ls *.txt
匹配所有以 .txt
結(jié)尾的文件,如:
file1.txt file2.txt notes.txt
? 2.?—— 匹配單個(gè)任意字符
$ ls file?.txt
匹配:
file1.txt fileA.txt fileZ.txt
但不匹配 file10.txt
或 file.txt
。
? 3.[]—— 匹配括號(hào)內(nèi)的任意一個(gè)字符
$ ls [abc].txt
匹配:
a.txt b.txt c.txt
也可以使用范圍:
$ ls [a-z].txt
匹配所有小寫(xiě)字母命名的 .txt
文件。
$ ls [0-9].txt
匹配數(shù)字命名的 .txt
文件。
? 4.[!]或[^]—— 匹配不在括號(hào)中的字符
$ ls [!a].txt
匹配除 a.txt
以外的所有單字符命名的 .txt
文件。
$ ls [^0-9].txt
匹配非數(shù)字命名的 .txt
文件。
? 5.{}—— 匹配多個(gè)指定字符串
$ ls file{1,2,3}.txt
匹配:
file1.txt file2.txt file3.txt
也可以用于路徑:
$ cp config/{dev,prod}.conf /etc/app/
復(fù)制 config/dev.conf
和 config/prod.conf
到目標(biāo)目錄。
? 6.**(遞歸通配符) —— 匹配多級(jí)目錄(需啟用)
shopt -s globstar $ ls **/*.log
匹配當(dāng)前目錄及其子目錄下的所有 .log
文件。
五、通配符在 Shell 腳本中的應(yīng)用
? 示例1:批量重命名文件
#!/bin/bash for file in *.txt; do mv "$file" "backup_$file" done
將當(dāng)前目錄下所有 .txt
文件重命名為 backup_*.txt
。
? 示例2:批量刪除臨時(shí)文件
rm *.tmp *.bak
刪除所有 .tmp
和 .bak
文件。
? 示例3:遞歸處理日志文件(需啟用globstar)
shopt -s globstar for log in **/*.log; do echo "Processing $log" cat "$log" | grep "ERROR" >> errors.log done
遍歷所有子目錄中的 .log
文件,提取包含 ERROR
的行,并追加到 errors.log
。
? 示例4:根據(jù)字符范圍篩選文件
ls [A-Z]*.sh
列出所有以大寫(xiě)字母開(kāi)頭的 Shell 腳本。
六、通配符 vs 正則表達(dá)式
特性 | 通配符(Glob) | 正則表達(dá)式(Regex) |
---|---|---|
使用場(chǎng)景 | 文件名匹配、路徑匹配 | 文本內(nèi)容匹配、字符串處理 |
支持命令 | ls, cp, rm, find, bash | grep, sed, awk, perl, python |
表達(dá)方式 | 簡(jiǎn)潔直觀 | 更復(fù)雜、功能強(qiáng)大 |
是否支持捕獲 | ? 不支持 | ? 支持 |
是否支持分組 | ? 不支持 | ? 支持 |
?? 注意: 通配符主要用于文件名和路徑匹配,正則表達(dá)式用于文本內(nèi)容匹配。
七、實(shí)戰(zhàn)案例:日志文件批量處理
?? 需求背景:
你有一個(gè)日志目錄,結(jié)構(gòu)如下:
/logs/ ├── app1/ │ ├── 2025-07-01.log │ └── 2025-07-02.log ├── app2/ │ ├── 2025-07-01.log │ └── 2025-07-02.log
你想提取所有日志中包含 ERROR
的行,并匯總到一個(gè)文件中。
? 實(shí)現(xiàn)腳本:
#!/bin/bash shopt -s globstar for log in /logs/**/*.log; do grep "ERROR" "$log" >> /tmp/errors.log done echo "已提取所有 ERROR 日志到 /tmp/errors.log"
八、常見(jiàn)問(wèn)題與解決方案
問(wèn)題 | 原因 | 解決方案 |
---|---|---|
No such file or directory | 沒(méi)有匹配的文件 | 使用 nullglob 選項(xiàng)避免報(bào)錯(cuò) |
通配符未展開(kāi) | 通配符被引號(hào)包裹 | 去掉引號(hào)或使用 eval |
** 未啟用 | 未啟用 globstar | 執(zhí)行 shopt -s globstar |
通配符匹配過(guò)多文件 | 通配符太寬泛 | 使用更精確的匹配模式 |
中文文件名匹配失敗 | 編碼問(wèn)題 | 確保終端使用 UTF-8 編碼 |
九、總結(jié)對(duì)比表:Bash 常用通配符一覽
通配符 | 含義 | 示例 |
---|---|---|
* | 匹配任意數(shù)量字符 | *.txt |
? | 匹配單個(gè)字符 | file?.txt |
[] | 匹配括號(hào)內(nèi)任意一個(gè)字符 | [a-z].txt |
[!] | 匹配不在括號(hào)中的字符 | [!a].txt |
{} | 匹配多個(gè)指定字符串 | file{1,2}.txt |
** | 遞歸匹配目錄 | **/*.log(需啟用) |
十、結(jié)語(yǔ)
到此這篇關(guān)于bash常用通配符的使用的文章就介紹到這了,更多相關(guān)bash 通配符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Shell腳本中判斷輸入?yún)?shù)個(gè)數(shù)的方法
這篇文章主要介紹了Shell腳本中判斷輸入?yún)?shù)個(gè)數(shù)的方法,使用內(nèi)置變量$#即可實(shí)現(xiàn)判斷輸入了多少個(gè)參數(shù),需要的朋友可以參考下2014-10-10Python創(chuàng)建、刪除桌面、啟動(dòng)組快捷方式的例子分享
這篇文章主要介紹了Python創(chuàng)建、刪除桌面、啟動(dòng)組快捷方式的例子分享,需要的朋友可以參考下2014-04-04根據(jù)公司需求寫(xiě)的一個(gè)linux 巡檢小腳本
這篇文章主要介紹了根據(jù)公司需求寫(xiě)的一個(gè)linux 巡檢小腳本,可以用來(lái)檢查服務(wù)器的一些運(yùn)行狀況,需要的朋友可以參考下2017-04-04Bash Shell腳本學(xué)習(xí)小結(jié)
今天需要寫(xiě)一個(gè)Shell腳本。很簡(jiǎn)單,判斷一個(gè)日志文件是否大大于2G,如果大于2G則刪除。久了沒(méi)有寫(xiě)bash,竟然一點(diǎn)都想不起來(lái)寫(xiě)了。于是復(fù)習(xí)了一下,下面對(duì)今天的學(xué)習(xí)做個(gè)小結(jié)2013-01-01Linux xargs命令如何將命令的結(jié)果作為參數(shù)
xargs是給命令傳遞參數(shù)的一個(gè)過(guò)濾器,也是組合多個(gè)命令的工具,這篇文章主要介紹了Linux xargs命令如何將命令的結(jié)果作為參數(shù),需要的朋友可以參考下2023-04-04