帮你精通Linux:通配符wildcard如斗地主的万能卡

零、引言

计算机术语 Wildcard 中文翻译为‘通配符’,这个意译可谓是通俗易懂。

然而,我们从‘通配符’这个中文术语中却看不到一点儿原词汇 wildcards 的影子。因为 wildcard 中既没有通配(universual),也没有符(symbol)。倘若直译,wildcard 字面含义 ’狂野卡‘,反倒更加简洁有力。狂野到何种地步呢?狂野到万能的地步。wildcard 的功能实际就是一张万能卡,是我们玩斗地主用的万能牌。

鉴于此,本文将以‘万能卡’指代‘wildcard’。Linux的资深读者,请自行以‘通配符’脑补替换。

wildcard(万能卡)包含三个字符,分别是星号 *,问号 ?和方括号 []。我们一一阐述。

一、星号 * 万能卡

字符星号(*)匹配零个或多个字符。我们拿到斗地主的一把牌,星号这张万能卡,可以当大王用,可以当王炸用,可以当四个A的炸弹用,甚至可以当做整副牌来用。这张万能卡代表零张到N张牌。

比如,我们列出当前目录下,所有以字母 D 起头的文件和目录

$ echo D* # 以D为开头
Desktop Documents Downloads
$ echo D*s # 以D为开头,s为结尾
Documents Downloads

我们拿到这样一张星号万能卡,斗地主自然横扫千军。

二、问号 ? 万能卡

字符问号(?)匹配任意一个字符。问号万能卡就是‘癞子斗地主’中的万能牌,可以当大王用,可以当小王用,可以当A用,但是只能作为一张牌。想要得到王炸,必须有好运气得拿到两张万能牌。

$ echo s?v # 使用一张万能卡
srv
$ echo s?? # 使用两张万能卡
srv sys
$ echo s* # 区别星号万能卡
sbin snap srv sys

三、方括号 [] 万能卡

方括号[]是匹配其中的任意字符。方括号就是握牌的手,手中拿着一副牌,出牌的时候从中抽出来任意一张打出去。需要注意的是装入[]内的字符,只能匹配一个结果。比如 a[xy]b 表示的是 axb 或者 ayb,而不能表示axyb。

斗地主里,我们用[JQKA]表示任意一张大牌,用[3456789]表示任意一张小牌。

但是按照上面[3456789]这种写法的逻辑,如果将表达所有的26个英文字母,是否要背诵一遍字母表呢?还好,我们有character-class(字符类)这个功能。表达任意26个小写字母只需写成 [a-z],26个大写字母则写成[A-Z],表达任意一个数字写成[0-9],同时表示三者则写作[a-zA-Z0-9]

另外,如果排除这些指定的字符,就使用!,如[!0-9], [!a-z] [!A-Z],表示除这些之外。

四、组合工具 {}

上述的星号,问号与方括号是万能卡(wildcard)的三种形式。观察发现,上面的案例中有个显著的缺陷,就是一次只能匹配一类。比如案例一当中,‘echo D’匹配目录下以D开头的文件或者目录。如果我既想要列出以大写D开头的,又想要以小写d开头的全部文件和目录,所能采取的方案只能是分别运行 ‘echo D' 和 ’echo d*'。

组合工具 {} 正是解决这一问题,它如绳索一般将各自为战的命令栓到一起。

$ echo {D*,d*,T*} # 输出分别以D,d,T开头的目录

Desktop Documents Downloads dwhelper Templates Test

另外大括号{},作为独立的用法可以输出连续的字符,比如

$ echo to{o..r}l
tool topl toql torl

五、设置 shopt

上文中我们介绍了wildcard的三个符号以及其组合工具。这四个基本功能有其局限性。

最大的局限是只能在单层目录内匹配查找,不能实现递归查找。

比如当我试图在 '~/Documents/OrgMode/ORG'目录下,找到所有的扩展名为‘org’的文件。

$ ls **/*.org
ls: cannot access '**/*.org': No such file or directory

此时,我们需要求助 shopt(shell options) 更改 shell 的默认设置。

shopt -s globstar # s 为 set

此时便可再尝试查找目录下所有的org文件。

关闭 globstar,则运行

shopt -u globstar # u 为unset

收尾总结

我们从斗地主的一副牌开始,依次介绍了三种万能卡:星号(*),问号(?)和方括号([]),以及组合工具,并在最后引入了 shopt(shopt) 更改系统的默认设置,释放万能卡的更大能量。

本文完结,盼对你有点滴启发与帮助。下回在熟悉的音乐声中,打开‘癞子斗地主’的时候,不忘忘记我们在Linux中的万能卡wildcard。

接下来,我们将探讨正则表达式 Regex。

展开阅读全文

页面更新:2024-05-21

标签:通配符   递归   癞子   方括号   组合   星号   问号   狂野   大王   术语   开头   字符   文件   目录   工具

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top