bash常用通配符的使用
一、前言
在 Linux Shell 編程和日常使用中,通配符(Wildcards) 是 Bash 提供的一種強大機制,用于匹配文件名、路徑、參數(shù)等,極大提升了命令行操作的效率。
本文將帶你全面了解 Bash 中常用的通配符,包括:
? 通配符的基本概念
? 常用通配符(如 *, ?, [], {})的使用方法
? 通配符在命令行與腳本中的應(yīng)用
? 通配符與正則表達式的區(qū)別
? 實戰(zhàn)案例:批量操作文件、日志處理、自動化腳本
? 常見問題與解決方案
并通過完整示例幫助你快速掌握 Bash 通配符的使用與技巧。
二、什么是通配符?
通配符(Wildcard) 是 Bash 中用于模式匹配的特殊字符,主要用于匹配文件名或路徑名。它們通常用于 ls、cp、rm、mv、find 等命令中,幫助用戶快速操作多個文件。
三、Bash 中常用的通配符一覽
| 通配符 | 含義 | 示例 |
|---|---|---|
| * | 匹配任意數(shù)量的任意字符 | *.txt → 匹配所有 .txt 文件 |
| ? | 匹配任意一個字符 | file?.txt → 匹配 file1.txt, fileA.txt |
| [] | 匹配括號中的任意一個字符 | [abc] → 匹配 a、b 或 c |
| [!] 或 [^] | 匹配不在括號中的字符 | [!a-z] → 匹配非小寫字母 |
| {} | 匹配多個指定的字符串 | file{1,2,3}.txt → 匹配 file1.txt, file2.txt, file3.txt |
| **(擴展) | 遞歸匹配目錄(需啟用 shopt -s globstar) | **/*.txt → 匹配所有子目錄下的 .txt 文件 |
四、通配符詳解與使用示例
? 1.*—— 匹配任意數(shù)量的字符
$ ls *.txt
匹配所有以 .txt 結(jié)尾的文件,如:
file1.txt file2.txt notes.txt
? 2.?—— 匹配單個任意字符
$ ls file?.txt
匹配:
file1.txt fileA.txt fileZ.txt
但不匹配 file10.txt 或 file.txt。
? 3.[]—— 匹配括號內(nèi)的任意一個字符
$ ls [abc].txt
匹配:
a.txt b.txt c.txt
也可以使用范圍:
$ ls [a-z].txt
匹配所有小寫字母命名的 .txt 文件。
$ ls [0-9].txt
匹配數(shù)字命名的 .txt 文件。
? 4.[!]或[^]—— 匹配不在括號中的字符
$ ls [!a].txt
匹配除 a.txt 以外的所有單字符命名的 .txt 文件。
$ ls [^0-9].txt
匹配非數(shù)字命名的 .txt 文件。
? 5.{}—— 匹配多個指定字符串
$ 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 到目標目錄。
? 6.**(遞歸通配符) —— 匹配多級目錄(需啟用)
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:批量刪除臨時文件
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
列出所有以大寫字母開頭的 Shell 腳本。
六、通配符 vs 正則表達式
| 特性 | 通配符(Glob) | 正則表達式(Regex) |
|---|---|---|
| 使用場景 | 文件名匹配、路徑匹配 | 文本內(nèi)容匹配、字符串處理 |
| 支持命令 | ls, cp, rm, find, bash | grep, sed, awk, perl, python |
| 表達方式 | 簡潔直觀 | 更復(fù)雜、功能強大 |
| 是否支持捕獲 | ? 不支持 | ? 支持 |
| 是否支持分組 | ? 不支持 | ? 支持 |
?? 注意: 通配符主要用于文件名和路徑匹配,正則表達式用于文本內(nèi)容匹配。
七、實戰(zhàn)案例:日志文件批量處理
?? 需求背景:
你有一個日志目錄,結(jié)構(gòu)如下:
/logs/ ├── app1/ │ ├── 2025-07-01.log │ └── 2025-07-02.log ├── app2/ │ ├── 2025-07-01.log │ └── 2025-07-02.log
你想提取所有日志中包含 ERROR 的行,并匯總到一個文件中。
? 實現(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"八、常見問題與解決方案
| 問題 | 原因 | 解決方案 |
|---|---|---|
| No such file or directory | 沒有匹配的文件 | 使用 nullglob 選項避免報錯 |
| 通配符未展開 | 通配符被引號包裹 | 去掉引號或使用 eval |
| ** 未啟用 | 未啟用 globstar | 執(zhí)行 shopt -s globstar |
| 通配符匹配過多文件 | 通配符太寬泛 | 使用更精確的匹配模式 |
| 中文文件名匹配失敗 | 編碼問題 | 確保終端使用 UTF-8 編碼 |
九、總結(jié)對比表:Bash 常用通配符一覽
| 通配符 | 含義 | 示例 |
|---|---|---|
| * | 匹配任意數(shù)量字符 | *.txt |
| ? | 匹配單個字符 | file?.txt |
| [] | 匹配括號內(nèi)任意一個字符 | [a-z].txt |
| [!] | 匹配不在括號中的字符 | [!a].txt |
| {} | 匹配多個指定字符串 | file{1,2}.txt |
| ** | 遞歸匹配目錄 | **/*.log(需啟用) |
十、結(jié)語
到此這篇關(guān)于bash常用通配符的使用的文章就介紹到這了,更多相關(guān)bash 通配符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用linux的timerfd_create實現(xiàn)計時器示例分享
這篇文章主要介紹了利用linux的timerfd_create實現(xiàn)計時器示例,需要的朋友可以參考下2014-02-02
shell學(xué)習(xí)教程獲取命令行參數(shù)示例
這篇文章主要介紹了shell學(xué)習(xí)中的基礎(chǔ)知識的獲取命令行參數(shù)示例,需要的朋友可以參考下2014-03-03
通過Shell腳本監(jiān)控Linux系統(tǒng)的CPU使用率
在現(xiàn)代運維與開發(fā)工作中,實時監(jiān)控系統(tǒng)資源使用情況是保障服務(wù)穩(wěn)定性的關(guān)鍵一環(huán),CPU?作為計算機的核心處理單元,其使用率直接影響系統(tǒng)的響應(yīng)速度和效率,本文將深入探討如何通過?Shell?腳本監(jiān)控?Linux?系統(tǒng)的?CPU?使用率,需要的朋友可以參考下2026-03-03
編寫B(tài)ash Shell通過gnuplot繪制系統(tǒng)性能數(shù)據(jù)圖的方法
這篇文章主要介紹了編寫B(tài)ash Shell通過gnuplot繪制系統(tǒng)性能數(shù)據(jù)圖的方法,做到可視化數(shù)據(jù)收集,需要的朋友可以參考下2015-07-07
Linux下查找后門程序 CentOS 查后門程序的shell腳本
這篇文章主要介紹了Linux下查找后門程序 CentOS 查后門程序的shell腳本,需要的朋友可以參考下2014-09-09

