一、创建测试环境
# 创建一个测试目录
mkdir test_globbing
cd test_globbing
# 创建各种测试文件
touch file1.txt file2.txt file10.txt file11.txt
touch fileA.txt fileB.txt fileAB.txt
touch report1.pdf report2.pdf report10.pdf
touch data.csv data1.csv data2.csv data10.csv
touch script.sh script.pl script.py
touch backup.tar backup.gz backup.zip
touch image1.jpg image2.png image3.gif
touch "my file.txt" "test file 1.txt" "hello world.txt"
touch .hidden .hidden.txt .config
mkdir dir1 dir2 dir10 subdir
touch dir1/file.txt dir1/data.csv
touch dir2/report.pdf dir2/script.sh
二、创建文件时的通配符
2.1 花括号 {} 扩展(最常用)
# 创建多个相似文件
touch file{A,B,C,D}.txt
# 创建: fileA.txt, fileB.txt, fileC.txt, fileD.txt
touch report{1,2,3,4,5}.pdf
# 创建: report1.pdf 到 report5.pdf
touch data_{2020..2025}.csv
# 创建: data_2020.csv 到 data_2025.csv
touch {a..z}.txt
# 创建: a.txt 到 z.txt
touch {1..10}.log
# 创建: 1.log 到 10.log
touch backup{,.tar,.gz,.zip}
# 创建: backup, backup.tar, backup.gz, backup.zip
2.2 组合使用
# 批量创建不同类型的文件
touch {jan,feb,mar}{1..5}.{txt,log,csv}
# 创建: jan1.txt, jan1.log, jan1.csv ... mar5.csv
# 创建带前缀后缀的文件
touch project_{a..c}_{1..3}.{bak,tmp}
# 创建多种组合
三、搜索文件时的通配符
3.1 * – 任意字符(最常用)
# 查找所有txt文件
ls *.txt
# file1.txt file2.txt fileA.txt fileB.txt ...
# 查找以file开头的所有文件
ls file*
# file1.txt file2.txt file10.txt fileA.txt ...
# 查找所有带数字的文件
ls *[0-9]*
# file1.txt file2.txt file10.txt report1.pdf data1.csv ...
# 查找所有隐藏文件(以.开头)
ls .*
# .hidden .hidden.txt .config
3.2 ? – 单个字符
# 文件名正好5个字符的txt文件
ls ?????.txt
# file1.txt, fileA.txt(5个字符)
# 查找file后面跟2个字符的文件
ls file??.*
# file10.txt, file11.txt, fileAB.txt
# 查找3个字符的文件
ls ???
# dir1, dir2(目录名也会列出)
3.3 [] – 字符集合
# 以a或b或c开头的文件
ls [abc]*
# 如果有a.txt, b.txt, c.txt
# 以数字开头的文件
ls [0-9]*
# 1.log, 2.txt, 10.txt
# 以大写字母开头的文件
ls [A-Z]*
# 如果有Report.pdf, Data.csv
# 以元音开头的文件
ls [aeiouAEIOU]*
# apple.txt, orange.log ...
# 文件名包含数字
ls *[0-9]*
# file1.txt, data2.csv, report10.pdf
3.4 [^] – 取反
# 不以数字开头的文件
ls [^0-9]*
# file1.txt, script.sh, data.csv(跳过1.log, 2.txt等)
# 不以字母开头的文件
ls [^a-zA-Z]*
# 1.log, 2.txt, 10.txt
# 不包含数字的文件
ls *[^0-9]*
# script.sh, backup.tar, image.jpg
3.5 花括号 {} – 多模式
# 查找txt和csv文件
ls *.{txt,csv}
# file1.txt, data.csv, fileA.txt ...
# 查找图片文件
ls *.{jpg,jpeg,png,gif,bmp}
# image1.jpg, image2.png, image3.gif
# 查找脚本文件
ls *.{sh,pl,py}
# script.sh, script.pl, script.py
# 查找备份文件
ls backup.{tar,gz,zip}
# backup.tar, backup.gz, backup.zip
四、高级搜索技巧
4.1 组合使用
# 以file开头,后面跟数字,扩展名是txt或csv
ls file[0-9]*.{txt,csv}
# file1.txt, file2.txt, file10.txt, file1.csv...
# 两个字符的文件名,扩展名是sh或pl
ls ??.{sh,pl}
# 如果有a.sh, b.sh, c.pl ...
# 不以file开头的所有txt文件
ls [^f]*.txt
# 如果有a.txt, b.txt, report.txt...
4.2 使用ls的选项配合
# 详细列出,按时间排序
ls -lt *.txt
# 列出所有文件(包括隐藏)
ls -la .*
# 按文件大小排序
ls -lS *.log
# 递归列出子目录
ls -R dir*
4.3 与其他命令配合
# 统计文件数量
ls *.txt | wc -l
# 删除所有备份文件
rm *.{bak,tmp,~}
# 移动所有图片到images目录
mv *.{jpg,png,gif} images/
# 复制所有配置文件
cp *.conf /etc/app/
# 查找大文件
ls -lh * | grep "M" # 包含M(兆字节)的文件
五、实用示例
5.1 按日期模式
# 创建按日期命名的文件
touch log_{20240101..20240131}.txt
# 查找某个月份的日志
ls log_202401*.txt
5.2 按版本号
# 创建版本文件
touch app_v{1..5}.{0..3}.jar
# 查找特定版本
ls app_v2.*.jar
5.3 按文件类型分组
# 文档文件
ls *.{doc,docx,pdf,txt}
# 图片文件
ls *.{jpg,jpeg,png,gif,svg}
# 压缩文件
ls *.{tar,gz,zip,rar,7z}
# 代码文件
ls *.{java,py,c,cpp,h,js,html,css}
六、注意事项
# 1. 空格文件需要转义
ls my\ file.txt
# 或用引号
ls "my file.txt"
# 2. 特殊字符需要转义
ls file\*.txt # 查找文件名为 file*.txt 的文件
# 3. 当前目录没有匹配时
echo *.none
# 输出: *.none (而不是报错)
# 4. 区分大小写(默认)
ls [A-Z]* # 只匹配大写字母开头
ls [a-z]* # 只匹配小写字母开头
✅ 总结
| 通配符 | 用途 | 示例 |
|---|---|---|
* | 任意字符 | *.txt |
? | 单个字符 | file?.txt |
[] | 字符集合 | [0-9]* |
[^] | 取反 | [^a-z]* |
{} | 多模式 | *.{txt,csv} |
通配符是Linux命令行中最基础也最强大的文件操作工具!
发表回复