介绍
Linux 通配符,也称为 globbing 模式,是 shell 中用于匹配和扩展文件名的特殊字符。了解如何使用这些强大的工具可以大大提高你在使用 Linux 命令行时的效率。本教程将引导你了解 Linux 通配符的基础知识,并演示如何利用它们来复制具有特定模式的文件,帮助你简化文件管理任务。
Linux 通配符,也称为 globbing 模式,是 shell 中用于匹配和扩展文件名的特殊字符。了解如何使用这些强大的工具可以大大提高你在使用 Linux 命令行时的效率。本教程将引导你了解 Linux 通配符的基础知识,并演示如何利用它们来复制具有特定模式的文件,帮助你简化文件管理任务。
在 Linux 中,通配符是帮助你使用模式匹配多个文件的特殊字符。当你需要一次管理许多文件时,它们特别有用。让我们通过检查当前目录中的文件来探索最常见的通配符。
首先,让我们看看我们有哪些文件可以使用:
cd ~/project/wildcards_lab
ls
你应该看到一个包含各种扩展名的文件列表,如下所示:
backup data_02.csv doc2.pdf file3.txt image3.jpg readme.md
config.yml data_03.csv documents images report1.txt report_final.txt
data_01.csv doc1.pdf file1.txt image1.jpg report2.txt script.sh
file2.txt image2.jpg
星号 * 是最常见的通配符。它匹配任意数量的字符(包括零个)。让我们看看它的实际应用:
列出所有文本文件(以 .txt 结尾):
ls *.txt
你应该看到:
file1.txt file2.txt file3.txt report1.txt report2.txt report_final.txt
列出所有图像文件(以 .jpg 结尾):
ls *.jpg
输出:
image1.jpg image2.jpg image3.jpg
问号 ? 恰好匹配一个字符。让我们用它来查找文件:
ls file?.txt
此命令将列出以 "file" 开头,后跟一个字符,并以 ".txt" 结尾的文件。
输出:
file1.txt file2.txt file3.txt
方括号 [] 允许你匹配来自指定集合的任何单个字符:
ls data_0[1-2].csv
此命令列出文件名匹配 "data_0" 后跟 1 或 2,然后是 ".csv" 的 CSV 文件。
输出:
data_01.csv data_02.csv
在 Linux 中,以点 (.) 开头的文件是隐藏文件。我们也可以使用通配符来查找它们:
ls .*
输出将包括:
. .. .hidden_file1 .hidden_file2
注意:. 和 .. 分别代表当前目录和父目录。
尝试这些命令并观察结果。在你继续使用它们进行文件复制操作之前,理解这些基本通配符至关重要。
现在你已经了解了基本的通配符,让我们使用它们来高效地复制文件。复制文件的一般语法是:
cp [options] source_file(s) destination
让我们创建一些组织目录,并练习使用不同的模式复制文件。
让我们将所有文本文件复制到 backup 目录:
cd ~/project/wildcards_lab
cp *.txt backup/
此命令将所有以 .txt 结尾的文件复制到 backup 目录。让我们验证一下:
ls backup/
你应该看到:
file1.txt file2.txt file3.txt report1.txt report2.txt report_final.txt
接下来,让我们将所有图像文件复制到 images 目录:
cp image*.jpg images/
这将所有以 "image" 开头并以 ".jpg" 结尾的文件复制到 images 目录。让我们检查一下:
ls images/
输出:
image1.jpg image2.jpg image3.jpg
大括号展开 {pattern1,pattern2} 允许你指定多个模式。让我们将 PDF 和 CSV 文件都复制到 documents 目录:
cp *.{pdf,csv} documents/
此命令将所有以 .pdf 或 .csv 结尾的文件复制到 documents 目录。让我们验证一下:
ls documents/
输出:
data_01.csv data_02.csv data_03.csv doc1.pdf doc2.pdf
我们也可以使用 || 运算符来复制匹配不同模式的文件:
cp report*.txt script.sh backup/
这将所有以 "report" 开头并以 ".txt" 结尾的文件,以及 script.sh 文件复制到 backup 目录。让我们检查一下 backup 目录中的内容:
ls backup/
更新后的输出:
file1.txt file2.txt file3.txt report1.txt report2.txt report_final.txt script.sh
复制文件时,你可能希望保留属性,例如时间戳和权限。使用 -p 选项:
cp -p config.yml backup/
要验证属性是否被保留:
ls -l config.yml
ls -l backup/config.yml
两个文件的时间戳和权限应该相同。
尝试使用这些命令进行实验,并探索不同的通配符模式如何帮助你高效地复制文件。
现在你已经掌握了基础知识,让我们探索一些更高级的通配符模式,以执行更具体的文件操作。
首先,让我们创建一个新目录来练习高级技术:
cd ~/project/wildcards_lab
mkdir advanced
字符类允许你匹配来自一组字符的单个字符:
## 复制以 'd' 或 'f' 开头的文件
cp [df]*.* advanced/
这将所有以 'd' 或 'f' 开头的文件复制到 advanced 目录。让我们检查一下:
ls advanced/
输出:
data_01.csv data_02.csv data_03.csv doc1.pdf doc2.pdf file1.txt file2.txt file3.txt
你可以在左方括号后使用 ! 或 ^ 符号来否定字符类。让我们复制不以 'r' 或 'i' 开头的文件:
mkdir advanced/filtered
cp [^ri]*.txt advanced/filtered/
让我们验证一下:
ls advanced/filtered/
输出:
file1.txt file2.txt file3.txt
让我们组合不同的通配符来创建更具体的模式:
## 复制以 'data_0' 开头,后跟一个数字,并以 '.csv' 结尾的文件
cp data_0?.csv advanced/
让我们验证一下,这是否正确地复制了我们的 CSV 文件:
ls advanced/*.csv
输出:
advanced/data_01.csv advanced/data_02.csv advanced/data_03.csv
Bash 提供了扩展的 globbing 模式,它比标准通配符更强大。首先,启用扩展的 globbing:
shopt -s extglob
现在我们可以使用类似以下的模式:
?(pattern):匹配零个或一个模式的出现*(pattern):匹配零个或多个出现+(pattern):匹配一个或多个出现@(pattern):恰好匹配一个出现!(pattern):匹配除模式之外的任何内容让我们尝试一个例子:
## 复制具有数字后跟 .txt 的文件
mkdir advanced/numbered
cp +([0-9])*.txt advanced/numbered/
结果可能为空,因为我们的原始文件与此确切模式不匹配。让我们创建一个匹配的文件:
touch 123file.txt
cp +([0-9])*.txt advanced/numbered/
ls advanced/numbered/
输出:
123file.txt
大括号展开对于创建复杂模式很有用:
## 为报告文件创建一个目录
mkdir advanced/reports
## 复制所有报告文件和配置文件
cp {report*.txt,*.yml} advanced/reports/
让我们检查一下:
ls advanced/reports/
输出:
config.yml report1.txt report2.txt report_final.txt
这些高级技术将帮助你在选择文件时更加精确,从而节省你在管理文件系统方面的时间和精力。尝试使用这些通配符的组合进行实验,看看它们如何帮助你更有效地管理文件。
在最后一步,我们将把我们所学的一切整合起来,以解决一个实用的文件管理问题。这个练习将加强你对通配符的理解,并展示它们的实际应用。
假设你是一名系统管理员,负责组织一个包含各种类型文件的目录。你需要:
让我们模拟这个场景:
首先,让我们创建一个新的项目目录,其中包含各种类型的文件:
cd ~/project/wildcards_lab
mkdir project_files
cd project_files
## 创建各种类型的文件
touch project_doc_v1.txt project_doc_v2.txt project_doc_final.txt
touch data_2023_01.csv data_2023_02.csv data_2023_03.csv
touch config_dev.yml config_test.yml config_prod.yml
touch backup_script_v1.sh backup_script_v2.sh
touch image001.png image002.png image003.png
touch .project_config .project_log
让我们检查一下我们的目录:
ls
输出:
backup_script_v1.sh config_prod.yml data_2023_02.csv image002.png project_doc_v1.txt
backup_script_v2.sh config_test.yml data_2023_03.csv image003.png project_doc_v2.txt
config_dev.yml data_2023_01.csv image001.png project_doc_final.txt
注意:隐藏文件(以 . 开头)不会出现在基本的 ls 输出中。
现在,让我们为不同的文件类型创建目录并组织我们的文件:
## 创建目录
mkdir docs configs scripts data images backups
## 将文本文件复制到 docs 目录
cp *doc*.txt docs/
## 将配置文件复制到 configs 目录
cp *.yml configs/
## 将脚本复制到 scripts 目录
cp *.sh scripts/
## 将数据文件复制到 data 目录
cp *.csv data/
## 将图像复制到 images 目录
cp *.png images/
让我们验证一下我们的组织:
echo "Documents:"
ls docs/
echo "Configurations:"
ls configs/
echo "Scripts:"
ls scripts/
echo "Data files:"
ls data/
echo "Images:"
ls images/
输出:
Documents:
project_doc_final.txt project_doc_v1.txt project_doc_v2.txt
Configurations:
config_dev.yml config_prod.yml config_test.yml
Scripts:
backup_script_v1.sh backup_script_v2.sh
Data files:
data_2023_01.csv data_2023_02.csv data_2023_03.csv
Images:
image001.png image002.png image003.png
让我们创建一个包含所有重要文件的全面备份:
## 创建所有非图像文件的备份
cp !(*.png|*backup*) backups/
## 让我们看看我们的备份目录中有什么
ls backups/
输出:
config_dev.yml config_test.yml data_2023_01.csv data_2023_03.csv project_doc_final.txt project_doc_v2.txt
config_prod.yml data_2023_02.csv project_doc_v1.txt
现在,让我们查找匹配特定模式的文件:
## 查找 2023 年的所有文件
echo "Files from 2023:"
ls *2023*
## 查找所有最终版本或生产版本
echo "Final/Production versions:"
ls *final* *prod*
## 查找所有版本 2 的文件
echo "Version 2 files:"
ls *v2*
输出:
Files from 2023:
data_2023_01.csv data_2023_02.csv data_2023_03.csv
Final/Production versions:
config_prod.yml project_doc_final.txt
Version 2 files:
backup_script_v2.sh project_doc_v2.txt
最后,让我们创建一个部署包,其中仅包含生产配置和最终文档:
mkdir deployment_package
cp *prod*.yml *final*.txt deployment_package/
## 检查我们的部署包
ls deployment_package/
输出:
config_prod.yml project_doc_final.txt
恭喜你!你已经成功地使用 Linux 通配符完成了实用的文件管理练习。这些技能对于在 Linux 环境中高效地管理文件、自动化重复任务以及有效地组织你的文件系统将非常宝贵。
在这个实验中,你已经学会了如何有效地使用 Linux 通配符来复制和管理具有特定模式的文件。你从基本的通配符开始,例如星号(*)、问号(?)和方括号([]),然后逐步掌握了更高级的技术,例如字符类、否定和扩展的 globbing(通配)。
以下是你已经掌握的关键技能:
这些技能将显著提高你在使用 Linux 命令行时的工作效率,使你能够自动化文件管理任务并有效地组织你的文件系统。随着你继续使用 Linux,这些通配符技术将成为你日常操作中不可或缺的工具。
记住,熟能生巧。你在日常工作中越频繁地使用这些通配符,你就会变得越舒适和熟练。