如何在 Linux 中使用通配符复制具有特定模式的文件

LinuxBeginner
立即练习

介绍

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

使用扩展的 Globbing

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

这些高级技术将帮助你在选择文件时更加精确,从而节省你在管理文件系统方面的时间和精力。尝试使用这些通配符的组合进行实验,看看它们如何帮助你更有效地管理文件。

实用文件管理练习

在最后一步,我们将把我们所学的一切整合起来,以解决一个实用的文件管理问题。这个练习将加强你对通配符的理解,并展示它们的实际应用。

场景

假设你是一名系统管理员,负责组织一个包含各种类型文件的目录。你需要:

  1. 按类型识别和分类文件
  2. 备份重要文件
  3. 根据特定的命名模式提取文件

让我们模拟这个场景:

创建一个模拟项目目录

首先,让我们创建一个新的项目目录,其中包含各种类型的文件:

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(通配)。

以下是你已经掌握的关键技能:

  1. 使用基本通配符(*,?,[])来匹配文件模式
  2. 复制具有特定扩展名或命名模式的文件
  3. 使用高级通配符技术进行更精确的文件选择
  4. 组合多个通配符和花括号展开以实现复杂模式
  5. 将这些技能应用于实际场景中组织和管理文件

这些技能将显著提高你在使用 Linux 命令行时的工作效率,使你能够自动化文件管理任务并有效地组织你的文件系统。随着你继续使用 Linux,这些通配符技术将成为你日常操作中不可或缺的工具。

记住,熟能生巧。你在日常工作中越频繁地使用这些通配符,你就会变得越舒适和熟练。