bash之通配符

article/2025/9/23 22:54:21

为什么要写这篇文章

我相信很多人和我一样,天天在使用linux的shell命令,也大概知道有通配符这么个概念,不过比较模糊。平时也会使用简单的通配符,也许还知道有正则表达式的存在,甚至不清楚两者的区别,往往搞混淆。

我也是同样的问题,从来没有好好地静下心来总结这些东西。其实学习东西还是要踏实,这样才能发挥工具最大的作用,不是吗?本篇文章就shell的通配符来做个总结,方便以后自己查找记忆。注意,这里的shell我指的是bash,因为我几乎就没用过其它的shell,哈哈。

 

通配符的概念

如果查阅bash的手册或者man文档,我们发现根本压根没有通配符(wildcard)这个字眼,是不是很奇怪呢?进一步查看,转而发现这个通配符概念是路径扩展(英文pathname expansion,或者是文件名扩展(filename expansion))功能中的模式匹配(pattern matching)功能。是不是有点意外呢?

哦,原来在bash中存在很多种形式的扩展(expansion),而路径扩展(或者说文件名扩展)只是其中之一而已,了解这点尤为关键。

那么bash中具体有哪些扩展呢?我们不妨列出来,如下:

  • brace expansion  (花括号扩展)
  • tilde expansion (波浪号扩展)
  • parameter and variable expansion (参数和变量扩展)
  • arithmetic expansion (算术扩展)
  • command substitution (命令置换)
  • word splitting (单词分割)
  • filename expansion (文件名扩展)
  • process substitution(进程替换)

好,本篇文章强调的通配符概念就是文件名扩展中的模式匹配知识点。OK,那么现在我们的问题就转变成了什么是bash的文件名扩展功能什么是文件名扩展功能中的模式匹配(pattern matching)bash又是如何处理这些功能的

很好理解,就是bash在扫描命令行参数(不了解命令行参数的组成部分的童鞋可以参考文章《学会使用getopt函数》)时会注意操作数(Operands)部分是否有*?,和[这些特殊模式字符(special pattern characters)。当它发现这些特殊模式字符时,会将它们视为要匹配的模式。通俗点说,就是bash发现参数部分有这些特殊字符时,会扩展这些符号,生成相应的已存在的文件名或者目录名,最后经过排序后传递给命令

 

模式匹配

好了,到这里,我们应该了解到,平时说的所谓通配符在bash中的专业叫法是模式匹配(pattern matching)。

这里顺便提一下,这个模式匹配相比正则表达式而言,那是简单多了,有关正则表达式可以参阅这篇文章《正则表达式简单学习记录》。

接下来,就让我们详细地了解bash中的特殊模式字符吧。

特殊模式字符以及含义

 

首先把上图列出的特殊模式字符分为两类:?*[set]是最常见的特殊模式字符,在几乎所有的shell中都支持;而后5项是bash的扩展特殊字符,如果想使用,请确保extglob是设置着的,即shopt -s extglob.

好了,接下来结合实际的例子来学些这些特殊模式字符吧!首先是常见的特殊模式字符。

 

特殊模式字符?匹配任何的单一字符。因此如果目录下有whizprog.c、whizprog.log与whizprog.o这三个文件,那么表达式whizprog.?匹配的结果是whizprog.c和whizprog.o,但是whizprog.log不匹配。

特殊模式字符*是一个功能强大而且广为使用的通配符,它匹配于任何字符组成的字符串(包括空字符串)。表达式whiziprog.*匹配前面提到的三个文件;网页设计人员可以使用*.html表达式匹配他们的所有输入文件。

关于特殊模式字符*,bash有个选项globstar来控制连续两个星号的行为,即出现**的情况:

什么意思呢? 意思就是说选项globstar在disable(shopt -u globstar)情况下,***的行为是一样的(即**和*匹配当前目录下的所有文件名和目录名,**/和*/匹配当前目录下的所有目录名)。但是一旦enable(shopt -s globstar),那么**就会递归匹配所有的文件和目录,而**/仅会递归匹配所有的目录。通过以下实例可以看出实际区别:

[10:06:14@astrol:/etc/systemd]# pwd && ls
/etc/systemd
journald.conf  logind.conf  network  resolved.conf  system  system.conf  timesyncd.conf  user  user.conf
[10:06:28@astrol:/etc/systemd]# shopt globstar
globstar        off
[10:06:36@astrol:/etc/systemd]#
[10:06:38@astrol:/etc/systemd]# echo *; echo **
journald.conf logind.conf network resolved.conf system system.conf timesyncd.conf user user.conf
journald.conf logind.conf network resolved.conf system system.conf timesyncd.conf user user.conf
[10:06:46@astrol:/etc/systemd]# echo */; echo **/
network/ system/ user/
network/ system/ user/
[10:06:53@astrol:/etc/systemd]# shopt -s globstar
[10:07:00@astrol:/etc/systemd]# echo *; echo **
journald.conf logind.conf network resolved.conf system system.conf timesyncd.conf user user.conf
journald.conf logind.conf network network/90-mac-for-usb.link network/99-default.link resolved.conf system system/basic.target.wants system/basic.target.wants/live-config.service system/clamav-daemon.service.d system/clamav-daemon.service.d/extend.conf system.conf system/dbus-org.freedesktop.ModemManager1.service system/dbus-org.freedesktop.nm-dispatcher.service system/default.target system/display-manager.service system/getty.target.wants system/getty.target.wants/getty@tty1.service system/graphical.target.wants system/graphical.target.wants/accounts-daemon.service system/hibernate.target.wants system/hibernate.target.wants/anacron-resume.service system/hybrid-sleep.target.wants system/hybrid-sleep.target.wants/anacron-resume.service system/iodined.service system/multi-user.target.wants system/multi-user.target.wants/anacron.service system/multi-user.target.wants/binfmt-support.service system/multi-user.target.wants/console-setup.service system/multi-user.target.wants/cron.service system/multi-user.target.wants/inetd.service system/multi-user.target.wants/irqbalance.service system/multi-user.target.wants/live-tools.service system/multi-user.target.wants/ModemManager.service system/multi-user.target.wants/networking.service system/multi-user.target.wants/NetworkManager.service system/multi-user.target.wants/nmbd.service system/multi-user.target.wants/openbsd-inetd.service system/multi-user.target.wants/pppd-dns.service system/multi-user.target.wants/remote-fs.target system/multi-user.target.wants/rsync.service system/multi-user.target.wants/rsyslog.service system/multi-user.target.wants/smartd.service system/multi-user.target.wants/smbd.service system/multi-user.target.wants/ssh.service system/multi-user.target.wants/vsftpd.service system/network-online.target.wants system/network-online.target.wants/networking.service system/samba-ad-dc.service system/sockets.target.wants system/sockets.target.wants/dm-event.socket system/sockets.target.wants/pcscd.socket system/sockets.target.wants/uuidd.socket system/sshd.service system/suspend.target.wants system/suspend.target.wants/anacron-resume.service system/sysinit.target.wants system/sysinit.target.wants/keyboard-setup.service system/sysinit.target.wants/lvm2-lvmetad.socket system/sysinit.target.wants/lvm2-lvmpolld.socket system/sysinit.target.wants/systemd-timesyncd.service system/syslog.service timesyncd.conf user user.conf
[10:07:05@astrol:/etc/systemd]#
[10:08:12@astrol:/etc/systemd]# echo */; echo **/
network/ system/ user/
network/ system/ system/basic.target.wants/ system/clamav-daemon.service.d/ system/getty.target.wants/ system/graphical.target.wants/ system/hibernate.target.wants/ system/hybrid-sleep.target.wants/ system/multi-user.target.wants/ system/network-online.target.wants/ system/sockets.target.wants/ system/suspend.target.wants/ system/sysinit.target.wants/ user/
[10:08:23@astrol:/etc/systemd]#

OK,接着看特殊模式字符[set],它与特殊模式字符?很相似,但允许匹配的更确切,把所有想要匹配的字符放在[ ]内,结果匹配其中的任一字符。可以使用波折号-表示范围,也可以使用第一个字符是!或者是^来表示反向匹配。举例如下:

 

whiziprog.[co]whizprog.[a-z]匹配文件whizprog.c和whizprog.o,但不匹配文件whizprog.log。

[abc][a-c]匹配字符a、b或c

[!0-9]或者[^0-9]匹配任何一个非数字字符

[a-zA-Z0-9_-]匹配任何一个字母、任何一个数字、下划线或者破折号(假设ASCII环境下)。

 

好了,介绍完了几个常见的特殊模式字符后,我们来看看bash的几个扩展特殊模式字符。使用它们之前,请确保选项extglob是打开的(shopt -s extglob)。

怎么说呢,有了这几个扩展的特殊模式字符,就使得模式匹配有了点正则表达式的味道,自此模式匹配也有了重复、可选的功能了。

注意,这里的pattern-list可以是符号|隔开的模式,表示可选功能。好了,废话不多说,让我们看几个实际例子吧。

(1)列出当前目录下以“ab”或者“def”打头的JPEG或者GIF文件

ls +(ab|def)*.+(jpeg|gif)

(2)列出当前目录下匹配与正则表达式ab(2|3)+\.jpg相同匹配结果的所有文件

ls ab+(2|3).jpg

匹配到的文件名诸如ab2.jpg,ab222.jpg,ab3.jpg,ab333.jpg等。

(3)删除当前目录下除了以jpeg或者gif为后缀的文件,你可能会写出以下表达式:

rm -rf *!(.jpeg|.gif)

但是很遗憾,结果是不对的!这条命令会把当前目录下的所有文件删除。为什么呢?这是因为一开始的星号(*)匹配了所有的文件,当然就包括以.jpeg和.gif为后缀的文件。正确的写法如下:

rm -rf !(*.jpeg|*.gif)

(4)如何列出(1)中的反方向结果呢?很简单加个括号再取反就OK!

ls !(+(ab|def)*.+(jpeg|gif))

 

参考链接:

《bash八大扩展一网打尽》

《shopt nullglob, failglob, extglob, globstar用法》

《Bash Extended Globbing》

《【Bash百宝箱】shell变量及扩展》

《Patterns and pattern matching》


http://chatgpt.dhexx.cn/article/M7CneBG3.shtml

相关文章

10.linux通配符

一,linux通配符及正则表达式 通配符:用于文件名匹配,是由shell解析,如find,ls,cp,mv。 *:匹配任意长度的任意字符 ?匹配任意单个字符 [ ]匹配指定范围内任意单个字符 […

Linux之通配符

一 Linux命令的共通知识点 1.通配符的使用 通配符:又叫文件名替换符号,符号具备特殊含义,例如:文件名:test,通配符可以写成???或者* *:代表可以匹配任意长度的文件名(all所有&am…

Linux详解:通配符

Linux是一款开源操作系统,其灵活性和可定制性一直受到开发者的喜爱和追捧。而且,Linux在文件管理方面提供了丰富的功能,例如通配符,它是一种用于匹配文件名的特殊字符。通配符在Linux中可以帮助我们更加方便和快捷地查找和操作文件…

linux通配符和正则表达式

1、 通配符 通配符是shell在做PathnameExpansion时用到的。说白了一般只用于文件名匹配,它是由shell解析的,比如find,ls,cp,mv等。 1、1 Shell常见通配符: 通配符含义实例*匹配 0 或多个字符a*b a与b之间…

黑客都怎么制作外挂?C++黑客编程收集的源码集合

VC黑客编程收集的代码: 打开远程telnet服务代码 浏览器 屏幕精灵 探测Windows主机的NetBIOS信息 获取asp代码的程序 聊天系统的列子 邮件发送代码 远程控制程序 sqlworm蠕虫 tini2后门代码 这些代码有的配有测试单元 ,有的没有,仅…

制作外挂需要多高的编程技术?

游戏外挂和游戏开发出游戏诞生之初注定是一对生死冤家,正常来讲制作外挂思路比较散,不一定要非常高的编程技术,而且外挂的制作也不是一劳永逸的,因为游戏公司也在不停的更新修改防御规则,只要游戏存在外挂也会层出不穷…

利用Python制作微信跳一跳外挂,微信好友装逼神器!

导语 前几天在GitHub上看到有人利用Python玩一款名为“跳一跳”的微信小程序,于是打算自己也来试一试,进群:711944363 获取微信跳一跳源码! 演示工具 电脑系统:Win10 Python版本:2.7.13(64位) 环境配置 Step1:安装Python 安装Python2.7并添加到环境变量中。 S…

CE+OD外挂制作实战 [提高篇]

人造指针&基址 实验目标:通过向游戏注入一段特殊汇编代码,实现自动获取动态地址.省略找基址的麻烦 为什么会出现人造指针 ? 1.基址偏移层数太多,很难找 2.有些游戏根本找不到基址 人造指针有什么优缺点? 1.人造指针就算游戏更新也无需去重复找基址 2.缺点是,需要注入代…

C/C++编程日记:制作一个简单的内存外挂

简单外挂 通过 C 语言编写一个简单的外挂,通过api函数修改游戏数据,从而实现作弊功能 对象分析 要用的 API 函数简单介绍 编写测试效果 本次游戏对象为 Super Mario XP 没有更新所以可用任意版本 试玩发现人物血量最大为 10,心最大为 99&…

外挂基础知识入门教学

{threadNotes} 外挂制作必备工具下载. 工具下载: peid 0.94 用于查壳,知道什么壳就可以脱壳拉. http://www.pediy.com/tools/unpack/File_analysers/peid/peid.rar OllyDbg调试器 调试游戏.http://www.pediy.com/tools/Debuggers/ollydbg/OllyICE.rarOD脱壳脚本 用…

C#简易外挂制作

【外挂修改器简单介绍】 游戏外挂分为很多种类型,例如本地客户端的内存修改、远程服务器的封包破解。 一般的网游由于服务器的机能限制,并不会将游戏产生的所有数据、计算都提供给服务器来承担。经常的,服务器只会将玩家人物的属性、血量、加…

旧手机改电脑外挂,文本补充

时间:2022/11/18 作者:二本双非小白 该文章主要针对小白 事情开始: 2022-06-02 某位华为大佬发布视频-----------旧手机改电脑外挂 视频链接:旧手机改电脑外挂-效率或将“提升300%?”_哔哩哔哩_bilibili 随着时间推移&…

利用Python做绝地科学家(外挂篇)

前言 玩吃鸡时间长的小盆友,应该晓得这游戏的体验非常差,特别是高端局,神仙满天飞。 所有今天我也要用Python写一个外挂,开始我的报复科学实验。 但是,要是。。。。。。要是被封号了,那就,那就…

外挂制作必备工具下载.

外挂制作必备工具下载. 工具下载: peid 0.94 用于查壳,知道什么壳就可以脱壳拉. http://www.pediy.com/tools/unpack/File_analysers/peid/peid.rar OllyDbg调试器 调试游戏. http://www.pediy.com/tools/Debuggers/ollydbg/OllyICE.rar OD脱壳脚本 用于脱壳. http:/…

游戏反外挂技术原理讲解

永远在路上 没有破解不了的反外挂系统,反外挂是一个对抗过程,需要不断升级。我们反外挂小组会采取对抗方式提升防御,也会研究竞品来获取灵感。反外挂也是非常有意思的,可以学到很多很多底层知识。 善战者无赫赫之功 反外挂&#x…

游戏外挂:用Python做个小游戏的开挂

小游戏开挂之路 一、工具的准备1.截屏和图像处理工具2.编辑器3.游戏原理分析二、开挂步骤1.移动鼠标2.点击鼠标3.相似图像查找原理4.实现开挂,自动做菜玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过外挂怎么制作出来的呢?现在来看一下怎么制作一个外…

网游外挂之制作流程

很多人都对网游外挂的制作很感兴趣,在这篇文章里,我向大家简单介绍一下一款网游外挂的大致制作流程。 首先,我想说明几点: 第一,这篇文章并不是具体教你如何写外挂,只是带你大致浏览一下网游外挂的制作流程…

干货!什么是游戏外挂,外挂的种类及实现原理

外挂,原指一切用来破坏游戏程序正常游戏数据和逻辑的工具或破解版。比如可以修改游戏内存数据的修改器,又比如可以修改网络数据包的抓包工具。这类外挂或多或少会影响游戏的内存数据、文件数据、网络数据,甚至代码逻辑。 但随着外挂市场的发…

各网游的外挂是如何做出来的?

每一个致力于学习黑客技术的人,最后都分为三种人。 第一种:入侵,各种入侵,玩的就是入侵的快感,或者恶作剧的喜感,或者那种有特殊“窥视”癖好的人……别误会,小编我是喜欢“恶作剧,…

shift后门入侵步骤

shift后门入侵 步骤 找到 C:\WINDOWS\system32\sethc.exe 文件并将其删除 在工具文件夹选项——查看中红圈中的更改了 将 C:\WINDOWS\system32\dllcache\sethc.exe删除,这个文件夹中放着缓存,如果不删除就会自动变回去找到 C:\WINDOWS\system32\cmd.exe…