在Linux或Unix系统中,Bash作为最常用的命令行解释器之一,提供了多种通配符(wildcards)来帮助用户更高效地进行文件操作。这些通配符可以用来匹配多个文件名或路径名,极大地简化了批量处理任务。本文将详细介绍Bash中常用的通配符及其使用场景。
一、基本通配符介绍
(一)星号 *
*
是最常见的通配符,它可以匹配任意长度的字符序列,包括空字符串。
示例:
假设当前目录下有以下文件:
file1.txt
file2.txt
image.jpg
backup.tar.gz
你可以使用如下命令列出所有以.txt
结尾的文件:
ls *.txt
这将输出:
file1.txt
file2.txt
(二)问号 ?
?
用于匹配单个任意字符。
示例:
如果你想要匹配只有一个字符不同的文件名,比如file1.txt
和file2.txt
,可以这样操作:
ls file?.txt
这同样会输出:
file1.txt
file2.txt
(三)方括号 [...]
**
方括号内可以指定一个字符集,匹配其中任何一个字符。也可以使用连字符 -
来表示范围。
示例:
-
匹配以
f
、b
开头的所有文件:ls [fb]*
输出可能为:
file1.txt file2.txt backup.tar.gz
-
匹配以数字结尾的文件:
ls *[0-9]
如果存在
file1
这样的文件,则会被列出。
(四)排除字符集 [^...]
或 [!...]
在方括号内加上^
或者!
可以在字符集中排除特定字符。
示例:
如果你想列出除.txt
以外的所有文件:
ls *.[^t][^x][^t]
或者更简洁的方式是直接排除:
ls !(*.txt)
注意:后一种方式需要开启extglob
选项,可以通过shopt -s extglob
来启用。
二、扩展通配符
除了上述基础通配符外,Bash还支持一些扩展模式匹配功能,但需先确保启用了extglob
选项。
(一)启用extglob
在终端中运行以下命令来启用扩展通配符支持:
shopt -s extglob
(二)扩展通配符示例
!(pattern)
:匹配任何不包含给定模式的文件。*(pattern)
:匹配零次或多次出现的给定模式。+(pattern)
:匹配一次或多次出现的给定模式。?(pattern)
:匹配零次或一次出现的给定模式。@(pattern)
:匹配一次给定模式。
示例:
假设目录中有如下文件:
fileA.txt
fileB.txt
fileC.log
fileD.log
- 列出所有非
.txt
文件:ls !(file*.txt)
- 查找至少有一个
file
前缀且扩展名为.log
的文件:ls +(file)*.log
三、实际应用场景
(一)批量重命名
结合通配符与mv
命令,可以轻松实现文件的批量重命名。
示例:
将所有.jpg
图片转换为.png
格式并重命名:
for file in *.jpg; do mv "$file" "${file%.jpg}.png"; done
(二)查找并删除特定类型的文件
使用通配符可以帮助快速定位并删除不需要的文件类型。
示例:
删除当前目录及其子目录下所有的临时文件(如.tmp
):
find . -name "*.tmp" -type f -delete
四、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!