Linux使用shell扩展匹配文件名的方法详解
一、命令行扩展
当在Bashshell提示符中键入命令时,shell在运行该命令行之前可以通过多个扩展对其进行处理。也可以使用这些shell扩展来执行原本很难或不可能完成的复杂任务。
Bash执行的主要扩展有:
大括号扩展,可以生成多个字符串
波形符扩展,扩展至用户主目录路径
变量扩展,将文本替换为shell变量中存储的值
命令替换,将文本替换为命令的输出
路径名扩展,帮助按模式匹配选择一个或多个文件
路径名扩展以前称为通配,是Bash最有用的功能之一。使用此功能,可以更加轻松地管理多个文件。使用“扩展”的元字符来匹配要寻找的文件名和路径名,可以一次性针对集中的一组文件执行命令。
1.1.路径名扩展和模式匹配
路径名扩展将表示通配符或字符类别的特殊字符模式扩展为与该模式匹配的文件名列表。在shell运行您的命令之前,它会将模式替换为匹配的文件名列表。如果该模式与任何内容都不匹配,则shell将尝试使用该模式作为其运行的命令的字面参数。下表列出了用于模式匹配的常见元字符和模式类。
元字符和匹配项表
| 模式 | 匹配项 |
| * | 由零个或更多字符组成的任何字符串 |
| ? | 任何一个字符 |
| [abc...] | 括起的类(位于两个方括号之间)中的任何一个字符 |
| [!abc...] | 不在括起的类中的任何一个字符 |
| [^abc...] | 不在括起的类中的任何一个字符 |
| [[:aIpha:]] | 任何字母字符 |
| [[:lower:]] | 任何小写字符 |
| [[:upper:]] | 任何大小字符 |
| [[:aInum:]] | 任何字母字符或数字 |
| [[:punct:]] | 除空格和字母数字以外的任何可打印字符 |
| [[:digit:]] | 从0到9的任何单个数字 |
| [[:space:]] | 任何单个空格字符,可能包括制表符、换行符、回车符、换行符或空格 |
使用示例:
创建一些示例
mkdir glob; cd glob touch alpha bravo charlie delta echo able baker cast dog easy

示例1:使用*进行简单模式匹配,分别匹配以“a”开头的所有文件名和所有含“a”的所有文件名。
所有以a开头的文件名
所有含“a”的所有文件名
匹配以“a”或“c”开头的所有文件名

示例2:使用问号(?)字符来匹配其中的一些文件名。这两个字符分别仅匹配四个和五个字符的文件名

1.2.大括号扩展
大括号扩展用于生成任意字符串。大括号包含字符串的逗号分隔列表或顺序表达式。结果包含大括号定义之前或之后的文本。大括号扩展可以互相嵌套。也可以使用双点语法(..),将它扩展为一个序列。例如,大括号内的{m..p}双点语法扩展为mnop。
注意:最常用的场景就是批量创建目录或则文件

1.3.波形符扩展
波形符(~)可匹配当前用户的主目录。如果开头为斜杠(\)以外的字符串,shell就会将该斜杠之前的字符串解译为用户名;如果存在匹配项,则用该用户的主目录绝对路径来替换此字符串。如果找不到匹配的用户名,shell将使用实际波形符加上该字符串。
在以下示例中,echo命令用于显示波形符字符的值。也可使用echo命令显示大括号和变量扩展字符等的值。

1.4.变量扩展
变量的作用类似于可以在内存中存储值的命名容器。通过变量,可以从命令行或在shell脚本内轻松访问和修改存储的数据。
您可以通过以下语法将数据作为值分配给变量:
[user@host -]$ VARIABLENAME=value
可以使用变量扩展将变量名称转换为命令行上的值。如果字符串以美元符号($)开头,那么shell就会尝试将该字符串的其余部分用作变量名称,并将它替换为变量中包含的任何值。

要预防因其他shell扩展而引起的错误,您可以将变量的名称放在大括号中,${VARIABLENAME}

注意:变量名称只能包含字母(大写和小写)、数字和下划线。变量名称区分大小写,不能以数字开头。
1.5.命令替换
命令替换允许命令的输出替换命令行上的命令本身。当命令括在括号中并且前面有美元符号($)时,会发生命令替换。$(command)形式可以互相嵌套多个命令扩展。

1.6.防止参数被扩展
在Bashshell中,许多字符有特殊含义。为防止命令行的某些部分上执行shell扩展,您可以为字符和字符串加引号(`)或执行转义(\)。
反斜杠(\)是Bashshell中的转义字符。它可以防止其后的字符被扩展。
例如:

在上面的示例中,保护美元符号免于扩展,Bash将其视为常规字符,因此也就未在$HOME上执行变量扩展。
如果要保护较长的字符串,则使用单引号(‘)或双引号(")来括起字符串。它们的作用略有不同。单引号将阻止所有shell扩展。双引号则阻止大部分shell扩展。
双引号可抑制美元符号($)、反斜杠(\)、反引号(`)和感叹号(!)以外的特殊字符在引用文本内发挥作用。这会阻止路径名扩展,但仍允许进行命令替换和变量扩展。

使用单引号则可以按字面解译引号之间的所有文本。

二、综合示例
1.使用ssh命令,以student用户身份登录serverb计算机。系统的配置支持使用SSH密钥来进行身份验证。

2.在Documents目录中创建一个名为project_plans的目录。Documents目录应该放到student用户的主目录中。在project_plans目录中创建两个空文件,取名为season1_project_plan.odf 和 season2_project_plan.odf.
提示: 如 ~/Documents目录不存在,请使用mkdir命令-p选项创建该目录。
mkdir -p ~/Documents
cd Documents
mkdir project_plans
touch season{1,2}_project_plan.odf或
mkdir -p ~/Documents/project_plans
touch ~/Documents/project_plans/{season1,season2}_project_plan.odf
ls -lR Documents/
3.创建本实验要使用的一组空白练习文件。使用shell的Tab补全功能可以轻松查找文件路径名。在/home/student 目录中创建名为tv_seasonX_episodeY.ogg的12个文件。将X替换为季数,Y替换为该季中的集数,共两季,每季六集。
touch tv_season{1,2}_episode{1..6}.ogg
ls tv*
4.作为一名成功的连载悬疑小说作者,您正在为出版下一部畅销书编辑章节。创建八个名为mystery_chapterX.odf的文件。将X替换为数字1到8。
touch mystery_chapter{1..8}.odf
ls mys*
5.使用一个命令在Videos目录下创建两个子目录,名称为season1和season2,以整理电视剧集。将适当的电视剧集移到电视季子目录中。仅使用两个命令,通过相对语法指定目的地。
5.1.利用一个命令,直接在Videos目录下创建名为season1,season2的子目录

5.2.仅使用两个命令,将适当的电视剧集移到电视季子目录中
mv tv_season1* Videos/season1 mv tv_season2* Videos/season2 ls -R Videos

6.利用单个命令创建一个两级目录层次结构,以整理悬疑小说章节。在Documents目录下创建my_bestseller 子目录,并在新的my_bestseller 目录下创建chapters子目录。利用一个命令,直接在my_bestseller目录下再创建3个子目录。将这些子目录命名为editor、changes和vacation。您不需要使用mkdir-p命令来创建父目录,因为已存在my_bestseller 父目录。
6.1.在Documents目录下创建my_bestseller目录。在my_bestseller目录下创建chapters目录。
mkdir -p Documents/my_bestseller/chapters ls -R Documents

6.2.利用一个命令,直接在my_bestseller目录下创建名为editor、changes和vacation的子目录
mkdir Documents/my_bestseller/{editor,changes,vacation}
ls -R Documents
7.切换为chapters目录。使用波形符(~)主目录快捷键,将所有图书章节移到chapters目录中,即您现在的当前目录。使用最简单的语法来指定目标目录。您想要将前两个章节将发送给编辑进行审阅。仅将这两个章节移到editor目录,以避免在审阅期间修改它们。从chapters子目录开始,使用带有范围的大括号扩展来指定要移动的章节文件名和目标目录的相对路径。
7.1.更改到chapters目录,再使用波形符(~)主目录快捷键,将所有的图书章节移到chapters目录中。
cd Documents/my_bestseller/chapters mv ~/mystery_chapter* . ls

7.2.将前两章移至editor目录,使用带有范围的大括号扩展来指定要移动的章节文件名和目标目录的相对路径。
mv mystery_chapter{1..2}.odf ../editor
ls
ls ../editor
7.3.使用单个命令,将第7章和第8章从chapters目录移到vacation目录。使用带有字符串列表的大括号扩展指定章节文件名,而不使用通配符字符。
mv mystery_chapter{7,8}.odf ../vacation
ls
ls ../vacation
8.将您的工作目录更改为~/Videos/season2,然后将本季的第一集复制到 vacation目录。使用一个cd命令,从工作目录更改为~/Documents/my_bestseller/vacation目录。列出其文件。使用上一工作目录参数,返回到season2目录。(如果最近一次用cd命令更改目录是通过一个命令而非多个cd命令来实现的,此参数会成功。)从season2目录,将第2集文件复制到vacation目录。再次使用快捷键返回到vacation目录。
8.1.将您的工作目录更改为~/Videos/season2,然后将本季的第一集复制到vacation目录。
cd ~/Videos/season2 cp *episode1.ogg ~Documents/my_bestseller/vacation

8.2.使用一个cd命令从你的工作目录更改为~/Documents/my_bestseller/vacation目录,列出其文件,然后使用 - 参数返回到上一目录。将第2集文件复制到vacation目录。使用带有 - 参数的cd命令返回到vacation目录。
cd ~/Documents/my_bestseller/vacation ls cd - cp *episode2.ogg ~/Documents/my_bestseller/vacation cd -

9.第5章和第6章的作者想要试验可能的修订。将这两个文件从~/Documents/my_bestseller/chapters 目录复制到]~/Documents/my_bestseller/changes 目录,以防止这些修订会修改原始文件。前往~/Documents/my_bestseller目录。使用方括号模式匹配来指定要在cp命令的文件名参数中匹配的章节号。
cd ~/Documents/my_bestseller cp chapters/mystery_chapter[56].odf changes ls chapters ls changes

10.将您的当前目录更改为changes目录,通过命令替换使用date +%F命令将mystery_chapter5.odf复制到包含完整日期的新文件。使用mystery_chapter5_YYYY-MM-DD.odf名称格式。通过date +%s命令来进行替换,制作mystery_chapter5.odf 的另一个副本,并且附上当前的时间戳(即自时期1970-01-0100:00UTC起的秒数),确保文件名独一无二。
cd changes cp mystery_chapter5.odf mystery_chapter5_$(date +%F).odf cp mystery_chapter5.odf mystery_chapter5_$(date +%s).odf ls

11.进一步审阅后,您决定不需要修订情节。删除changes目录。
如有必要,前往changes目录并删除该目录中的所有文件。如果是当前工作目录,您无法删涂该目录。
更改到changes目录的父目录。尝试使用rm命令(不带-r递归选项)来删除空目录。此尝试应该会失败。最后,使用rmdir命令删除空目录,而这会成功。度假结束后,您不再需要vacation目录。通过使用rm命令(带递归选项)删除该目录。完成时,返回到student用户的主目录。
11.1.删除changes目录。更改changes目录的父目录,再尝试使用不带-r递归选项的rm命令来删除空目录。
rm mystery* cd .. rm changes rmdir changes ls

11.2.使用带有-r选项的rm命令来删除vacation目录。返回到student用户的主目录。
rm -r vacation ls cd

12. 创建~/Documents/project_plans/season2_project_plan.odf 文件的硬链接,取名为-/Documents/backups/season2_project_plan.odf.back,硬链接可防意外删除原始文件,并在您更改原始文件时使备份文件保持更新。提示:如果~/Documents/backups目录不存在,请使用mkdir命令创建该目录。
12.1.创建~/Documents/project_plans/season2_project_plan.odf 文件的硬链接,取名为-/Documents/backups/season2_project_plan.odf.back
mkdir -p ~/Documents/backups ln ~/Documents/project_plans/season2_project_plan.odf \ ~/Documents/backups/season2_project_plan.odf.back ls -lR ~/Documents/

以上就是Linux使用shell扩展匹配文件名的方法详解的详细内容,更多关于Linux shell扩展匹配文件名的资料请关注脚本之家其它相关文章!
相关文章
详解Linux中atime,mtime,ctime的使用场景
这篇文章主要介绍了Linux的三个时间atime,mtime,ctime详细说明与使用场景,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起了解一下2022-10-10


最新评论