GLOB - Linux手册页
Linux程序员手册 第7部分
更新日期: 2020-08-13
名称
glob-遍历路径名
说明
很久以前,在UNIX V6中,有一个程序/ etc / glob可以扩展通配符模式。不久之后,它成为内置的shell。
如今,还有一个库例程glob(3)将为用户程序执行此功能。
规则如下(POSIX.2,3.13)。
Wildcard matching
如果字符串包含字符aq?aq,aq * aq或aq [aq中的一个,则是通配符模式。 Globbing是将通配符模式扩展到与该模式匹配的路径名列表中的操作。匹配定义为:
aq?aq(不在方括号之间)匹配任何单个字符。
aq * aq(不在方括号之间)匹配任何字符串,包括空字符串。
角色类
表达式" [...]",其中前导aq [aq之后的第一个字符不是aq!aq匹配单个字符,即括号内的任何字符。括号中的字符串不能为空;因此,只要是第一个字符,就可以在方括号之间使用aq] aq。 (因此," [[] [!]""匹配三个字符aq [aq,aq] aq和aq!aq。)
范围
有一个特殊约定:用aq-aq分隔的两个字符表示一个范围。 (因此," [A-Fa-f0-9]"等同于" [ABCDEFabcdef0123456789]"。)通过将其作为方括号之间的第一个或最后一个字符,可以在字面上包含aq-aq。 (因此," -"仅匹配两个字符aq] aq和aq-aq," [-0]"匹配三个字符aq-aq,aq.aq,aq0aq,因为aq / aq不能为匹配。)
补全
表达式" [!...]"与单个字符匹配,即与从中删除第一个aq!aq所获得的表达式不匹配的任何字符。 (因此," [[!] a-]"匹配除aq] aq,aqaaq和aq-aq之外的任何单个字符。)
可以通过在反斜杠前面加上反斜杠来删除aq?aq,aq * aq和aq [aq的特殊含义,或者,如果这是shell命令行的一部分,则将其用引号引起来。在括号之间,这些字符代表自己。因此," [[?* ]"匹配四个字符aq [aq,aq?aq,aq * aq和aq \ aq。
Pathnames
globbing分别应用于路径名的每个组成部分。路径名中的aq / aq不能与aq?aq或aq * aq通配符或" [.-0]"之类的范围匹配。包含显式aq / aq字符的范围在语法上不正确。 (POSIX要求语法上不正确的模式必须保持不变。)
如果文件名以aq.aq开头,则必须明确匹配此字符。 (因此,rm *不会删除.profile,而tarc *不会存档您的所有文件; tar.c更好。)
Empty lists
上面给出的简单规则:"将通配符模式扩展到匹配的路径名列表中"是最初的UNIX定义。它允许一个模式扩展为一个空列表,如
xv -wait 0 *.gif *.jpg
可能不存在* .gif文件的地方(这不是错误)。但是,POSIX要求在语法上不正确或匹配路径名列表为空时,通配符模式必须保持不变。使用bash可以使用以下命令强制执行经典行为:
shopt -s nullglob
(类似的问题在其他地方也会发生。例如,旧脚本有
rm `find . -name "*ti"`
新脚本需要
rm -f nosuchfile `find . -name "*ti"`
以避免rm调用的错误消息带有空参数列表。)
备注
Regular expressions
请注意,通配符模式不是正则表达式,尽管它们有点相似。首先,它们匹配文件名,而不是文本,其次,约定不一样:例如,在正则表达式中,aq * aq表示零个或多个先前内容的副本。
现在,正则表达式具有括号表达式,其中用aqhaaq表示否定,POSIX已声明未定义通配符模式" [ha ...]"的作用。
Character classes and internationalization
当然,范围最初是ASCII范围,因此" [[-%]"代表" [[!!"#$%]"和" [az]"代表"任何小写字母"。一些UNIX实现将其概括为范围XY代表字符集,其中的代码介于X和Y的代码之间。但是,这要求用户了解本地系统上使用的字符编码,而且,如果整理顺序为本地字母与字符代码的顺序不同。因此,对于通配符模式和正则表达式,POSIX都大大扩展了括号符号。在上面,我们看到了括号表达式中可能出现的三种项目: )的否定,(ii)明确的单个字符和(iii)范围。POSIX以一种在国际上更有用的方式指定范围,并添加了另外三种类型:
(iii)范围X-Y包含当前排序规则中位于当前语言环境中LC_COLLATE类别所定义的X和Y(含)之间的所有字符。
(iv)命名角色类,例如
[:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:]
这样一来,人们可以说" :: lower:"而不是" [a-z]",并且在丹麦也能正常工作,因为字母表中的aqzaq后面有三个字母。这些字符类由当前语言环境中的LC_CTYPE类别定义。
(v)整理符号,如" [.ch。]"或" [.a-acute。]",其中" [。"之间的字符串"。]"是为当前语言环境定义的整理元素。请注意,这可能是一个多字符元素。
(vi)等价类表达式,例如" [= a =]",其中" [="和" =]"之间的字符串是其等价类中为当前语言环境定义的任何整理元素。例如," = a ="可能等同于" [a'a \ a:a ^ a]",即" [a [.a-acute。] [。a-grave 。] [。a-umlaut。] [。a-circumflex。]]"。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。