Section: Linux Programmer's Manual (7)
Updated: 12 June
1998
Index
NAME
glob - 形成路径名称
描述 (DESCRIPTION)
很久以前 在 UNIX V6 版 中 有一个 程序 /etc/glob 用来 展开 通配符模板.
不久以后 它 成为 shell 内建功能. 现在 人们 开发了 类似的 库函数 glob(3), 让 用户程序 实现 同样的 功能.
此 规则 遵循 (POSIX 1003.2, 3.13).
通配符匹配 (WILDCARD MATCHING)
包含 '?', '*' 或 '[' 字符的 字符串 称为 通配符模板(wildcard
pattern). 形成路径名(globbing) 指 一种 *** 作, 把 通配符模板 展开为 匹配 该串的 路径名. 匹配 定义为:
不在 方括弧中 的 '?' 匹配 任意 单个 字符.
不在 方括弧中 的 '*' 匹配 任意 字符串, 包括 空串.
字符集 (Character classes)
对于 表达式 `[...]', 如果 在 第一个 '['符 后面 出现的 第一个 字符 不是
'!', 则 该 表达式 匹配 任意 一个 在 `[...]'内 出现的 字符. 方括弧内 不能 有 空串, 因此 ']' 可以 作为 第一个 字符 出现在
方括弧内. (像 这样, '[][!]' 匹配 下列三个 字符 中的 任意 一个, '[', ']' 和 '!'.)
范围集 (Ranges)
字符集 有一个 特例: 用 '-' 分开的 两个 字符 表示 一个 范围集. (像 这样, `[A-Fa-f0-9]'
等于 `[ABCDEFabcdef0123456789]'.) 把 '-' 放到 方括弧内 的 开头 或 最后 可以 获得 它的 本意. (像 这样,
`[]-]' 匹配 ']'和'-' 中 任意 一个. 而 `[--/]' 匹配 `-', `.' 和`/'中任意 一个.)
补集 (Complementation)
表达式 '[!...]' 表示 一个 字符, 该 字符 不匹配 方括弧内 去掉 开头 '!' 后的
表达式. (像 这样, `[!]a-]' 匹配 除了 ']', 'a' 和 '-' 的 任意 一个 字符.)
要 去掉 '?', '*' 和 '[' 的 特殊 含义, 可以 通过 前面 加 一个 反斜杠或者 在 shell 命令行 中, 通过 引号 来 引用
这些 字符. 在 方括弧内 这些 字符 显露出 本意, 所以, '[[?*\]' 匹配 这 四个字符中 的 一个: '[', '?', '*', '\'.
路径名 (PATHNAME)
形成路径名 功能 应用于 路径 中 的 每一个 成员部分. 路径 中 的 '/' 不能 被通配符 '?' 或
'*', 或 范围集 如 '[.-0]' 匹配. 范围集 不能 直接 包含 '/', 否则 导致 语法错误.
如果 待匹配的 文件名 以'.'开头, 那么 这个 '.' 字符 必须 直接 给出. (比如说, 用 'tar c .' 会 更好.)
空列表 (EMPTY LISTS)
上述的 简单优雅 规则, 把 通配符模板 展开为 匹配的 路径名, 来源于 最初的 UNIX 定义. 它
允许 展开出 空串, 例如 xv -wait 0 *.gif *.jpg
这里 可能 没有 *.gif 文件 (而且 不算 错误).
然而, POSIX 要求 句法 错误 或 路径名 列表 为 空 时, 保留 通配符模板 不变. (译注: 即 不展开.)
在 bash 中 可以 通过 设置 allow_null_glob_expansion=true 把 它 强置为 传统的
风格. (其他 地方 也有 类似的 问题, 例如, 老式的 语句 是
rm `find . -name "*~"`
新的 写法 为
rm -f nosuchfile `find . -name "*~"`
以 避免 由于 空参数调用 rm 而 产生 错误信息.)
注意 (NOTES)
正规表达式 (Regular expressions)
注意, 通配符模板 不是 正规表达式, 尽管 它们 有点象. 首先, 它 匹配 文件名,
而 不是 正文其次, 规则 不一样, 例如 正规表达式 里 的 '*' 代表 零个或多个 前面内容的 重复.
正规表达式 的 方括弧表达式 用 '^' 引导 取反 *** 作, (而不是 '[!...]'). POSIX 声明, 在 通配符模板 中, '[^...]'
未做 定义.
字符集 和 国际化 (Character classes and Internationalization )
当然, 范围集 最初 指
ASCII的 范围, 因此 '[ -%]' 意思是 '[ !"#$%]',
一些 UNIX实现 把 这个 归纳为: 范围 X-Y 指 X的编码 到 Y的编码 之间的编码字符. 可是, 这 要求 用户 知道 他们 本地系统的
字符编码, 此外, 如果本地的 字母表顺序 和 字符集顺序 不对应, 那 就 更不方便了.
因此, POSIX 对 通配符模板 和 正规表达式 的 方括弧表达法 作了 重大扩展, 上面 我们 知道了 方括弧表达式 中 的 三个 类型, 它们是
(i) 取补集 (ii) 直接列出的 单个字符 和 (iii) 范围集.
POSIX 对 范围集 在 国际化 方面 作了 更有力的 说明, 并且 增加了 三个 类型:
(iii) 范围 X-Y 由 X 和 Y 之间 所有的字符 组成 (包括X和Y), X 和 Y 的 当前编码序列 由 当前场合的 LC_COLLATE
分类定义.
(iv) 命名字符集, 象
[:alnum:] [:alpha:] [:blank:] [:cntrl:]
[:digit:] [:graph:] [:lower:] [:print:]
[:punct:] [:space:] [:upper:] [:xdigit:]
因此 可以 用 '[[:lower:]]' 代替 '[a-z]', 它 在 丹麦语 里 同样 有效, 虽然 丹麦的 字母表 里 'z' 后面 还有
三个 字母. 这些 字符集 由 当前场合的 LC_CTYPE 分类定义.
(v) 符号对映, 象 '[.ch.]' 或 '[.a-acute.]', 在 '[.' 和 '.]' 之间的 字符串 是 定义 在 当前场合的
对映元素. 注意 这 可以 是 多字符元素.
(vi) 等类表达式, 象 '[=a=]', 在 '[=' 和 '=]' 之间的 字符串 是 任意 等类 中 的 对映元素, 它 定义在 当前场合.
例如, '[[=a=]]' 可以 等同于 `[a徉溻]' (警告: 这里 有 Latin-1 字符), 也就是
`[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]'.
SEE ALSO
sh(1), glob(3), fnmatch(3),
locale(7), regex(7)
文件通配符* 匹配零个或多个字符 ? 匹配任何单个字符 ~ 当前用户家目录 ~mage 用户mage家目录 ~+ 当前工作目录 ~- 前一个工作目录 [0-9] 匹配数字范围 [a-z]:字母(或的关系)就是表示中括号中的某一个字符 [A-Z]:字母 [a-c]:a A b B c [A-C]:A b B c C,也就是[]在里面匹配字母时是以aAbB...这样排序的 [wang] 匹配列表中的任何的一个字符 [^wang] 匹配列表中的所有字符以外的字符 {}花括号用来匹配一组用逗号分隔的字符串中的任一个。 左花括号之前的所有字符称为前文(preamble),右花括号之后的所有字符称为后文(preamble)。 前文和后文都是可选的。花括号中不能包含不加引号的空白符预定义的字符类:man 7 glob(通配符) [:digit:]:任意数字,相当于0-9 [:lower:]:任意小写字母[:lower:] 这个只相当于a-z,表示的时候必须要在加上中括号 [:upper:]: 任意大写字母 [:alpha:]: 任意大小写字母 [:alnum:]:任意数字或字母 [:blank:]:水平空白字符 [:space:]:水平或垂直空白字符 [:punct:]:标点符号 [:print:]:可打印字符 [:cntrl:]:控制(非打印)字符 [:graph:]:图形字符 [:xdigit:]:十六进制字符ls命令的功能: 列出当前目录的内容或指定目录ls命令的用法:ls [options] [files_or_dirs] 示例: ls -a 包含隐藏文件 ls -l 显示额外的信息 ls -r 倒转排序或者可以说是逆序排列 ls -R 目录递归通过(递归会进入到子目录) ls -ld 目录和符号链接信息 ls -1 文件分行显示(列显示) ls –S 按从大到小排序(按文件的大小排序) ls –t 按mtime排序(按文件的修改时间排序) ls –u 配合-t选项,显示并按atime从新到旧排序 ls –U 按目录存放顺序显示(以创建文件的次序进行显示) ls –X 按文件后缀排序 ls -d 列出目录本身并不显示内容 ls -h 单位换算 ls -I --ignore(忽略)=PATTERN(模式)按着规定的模式去隐藏不进行显示 实例: 1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数 字的文件或目录 ls -d /var/l*[0-9]*[[:lower:]] 2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录 ls -d /etc/[0-9]*[^0-9] 3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符 的文件或目录 ls -d /etc/[^[:alpha:]][[:alpha:]]* 4、显示/etc/目录下所有以rc开头,并后面是0-6之间的数字,其它为任意字符 的文件或目录 ls -d /etc/rc[0-6]* 5、显示/etc目录下,所有以.d结尾的文件或目录 ls -d /etc/*.d 6、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录 ls -d /etc/[mnrp]*.conf 7、只显示/root下的隐藏文件和目录 ls -d /root/.* ls -aI "[^.]*" 当前目录为/root l. ls -d .* --color=auto 当前目录为/root 8、只显示/etc下的非隐藏目录 ls -d /etc/*/欢迎分享,转载请注明来源:内存溢出
评论列表(0条)