通配符(Wildcards)是Linux/Unix系统中用于匹配文件名和路径的特殊字符,它们允许您在不完全知道文件名的情况下操作多个文件。通配符由shell解释,而不是由各个命令解释。
*
代表任意长度的任意字符(包括零个字符)。
示例:
# 列出当前目录下所有.txt文件
ls *.txt
# 复制所有以"report"开头的文件
cp report* /backup/
# 删除所有以".tmp"结尾的文件
rm *.tmp
?
代表任意一个字符。
示例:
# 列出所有5个字符长且以.txt结尾的文件
ls ????*.txt
# 查找file1.txt, file2.txt等,但不匹配file10.txt
ls file?.txt
[]
匹配括号内指定的任意一个字符。
示例:
# 匹配file1.txt或file2.txt
ls file[12].txt
# 匹配a.txt, b.txt, c.txt
ls [a-c].txt
# 匹配任何数字
ls file[0-9].txt
[^]
或 [!]
匹配不在括号内的字符。
示例:
# 匹配不以数字结尾的文件
ls *[^0-9].txt
# 匹配不以a,b,c开头的文件
ls [!a-c]*
{}
可以生成多种组合,不是严格意义上的通配符,但非常有用。
示例:
# 创建多个目录
mkdir -p /path/{dir1,dir2,dir3}
# 复制文件到多个备份
cp file.txt{,.bak,.backup}
# 等同于 cp file.txt file.txt.bak file.txt.backup
结合 ?
和 *
可以精确匹配字符数量。
示例:
# 匹配正好5个字符的文件名
ls ?????*
# 匹配至少3个字符的文件名
ls ???*
# 将所有.jpg文件改为.png
for file in *.jpg; do mv "$file" "${file%.jpg}.png"; done
# 查找所有2020年1月到9月的日志文件
ls log_2020-0[1-9]-*.txt
# 删除所有临时文件但先确认
rm -i *.tmp
引号的影响:通配符在引号中不会展开
# 这不会匹配文件,而是查找字面上的"*.txt"
find . -name "*.txt"
# 这会展开通配符
find . -name *.txt
隐藏文件:通配符默认不匹配以点(.)开头的隐藏文件
# 要匹配隐藏文件,需要明确指定
ls .*
递归匹配:使用**
可以递归匹配(需要启用globstar选项)
shopt -s globstar
ls **/*.txt # 当前目录及子目录中的所有.txt文件
区分大小写:Linux文件系统通常区分大小写
# 这两个匹配不同
ls *.TXT
ls *.txt
掌握通配符可以显著提高您在Linux命令行中的工作效率,是每个Linux用户必备的基础技能。