对话 UNIX:第 2 部分: 做得多不如做得巧( 二 )


$ cp ~joe/doc/report.txt ~/info
假设 joe 的 home 目录位于 /guests , 而您的 home 目录为 /staff/bobr , ~joe 将由 /guests/joe 替换 , 而 ~ 则变成 /staff/bobr , 最后产生命令 cp /guests/joe/doc/report.txt /staff/bobr/info 。(请参见侧栏“检验您的工作以了解如何预览命令行 。)
另一个有用的符号是 ..(两个点号) , 这是当前目录的父目录的简写 。使用 .. 和 .(当前工作目录的简写符号) , 您可以引用文件系统中相对于当前工作目录的文件和目录 。
例如 , 如果您的当前工作目录为 ~/jane/projects/lambda , 那么简写 ../.. 表示向上两级目录的目录 , 即 ~/jane 。要表示包含 ~/jane 的目录 , 您可以使用 ../../../(“向上三级目录)或路径 ~jane/../ 。后面的这个路径表示从 ~jane 开始 , 然后转到上一级目录 。
要将文件复制到您的当前目录 , 不需要指定目标目录 , 可以直接使用 .(“点)来表示:
$ cp -pr /path/to/lots/of/stuff .
前面的命令将 /path/to/lots/of/stuff 目录递归地复制到您的当前目录 , 并保持其原始的时间和日期戳 。引用 .. 和 . 的路径名称为相对路径名 。以 /(正斜杠)或 ~(波浪符号)开头的路径名称为绝对路径名 , 因为您是从文件系统的顶端、或从一个目录层次结构的顶端开始来引用相应的文件 。
通配符和模式
使用符号 , 可以节省输入的时间 , 并且可以快速和精确地引用特定的目录 。通配符 是另一种简写形式 , 用来引用目录中的内容 。
例如 , 假设您的某个目录中包含了 100 个文件 。有些是以 .c 为后缀的 C 源代码文件 , 其他一些是以 .o 为后缀的目标文件 , 还有一些是文本文件 (.txt)、脚本 (.sh) 和可执行文件(具有执行权限的文件) 。要仅列出其中的 C 文件 , 只需输入:
$ ls *.c
通配符 *(通常称为 star 而不是 asterisk)表示匹配任何字符序列 。.c 文件扩展名是一种文本模式 , 它仅匹配点号加小写字母 c 的情况 。所以 , *.c 表示任何字符序列加上点号和小写字母 c 。在给定了 *.c 之后 , Shell 将查看当前目录(除非您提供一个起始绝对或相对路径名) , 找出所有匹配这个模式的文件名 , 将 *.c 扩展为文件名列表 , 然后将这个列表作为参数传递给 ls 命令 。
清单 2 基于 wget 的源代码文件演示了 *.c 的使用 , wget 是一种命令行的下载实用工具 。
单 2. 使用通配符在目录中查找 C 源代码文件
$ ls *.c
alloca.c
ansi2knr.c
cmpt.c
connect.c
convert.c
...
将通配符展开为匹配文件名列表的过程称为通配符匹配 (globbing) , 并且 Unix Shell 具有各种各样的通配符匹配操作符(所谓的 glob) , 以便帮助您描述所要查找的内容:
通配符匹配操作符 *(星号)匹配任何字符或字符序列 , 包括空序列 。
通配符匹配操作符 ?(问号)匹配任何单个的字符 。
通配符匹配操作符 [ ](方括号)匹配任何括起来的字符 。在方括号中 , 通过使用 -(连字符) , 比如 [a-z] 或者所有的小写字母 , 您可以引用某个范围的字符 。
(Z Shell 具有许多独特的通配符匹配操作符 。有关 Z Shell 通配符匹配操作符的更多信息 , 请参见侧栏 。)
您还可以根据需要重复使用通配符匹配操作符 。清单 3 提供了一些其他示例 。
在清单 3 中 , 命令 1 显示了该目录中所有的条目 , 包括长列表中那些以 .(点)开头的条目 。(-a 选项显示了所谓的点文件;-1 选项表示在一列中列出所有的内容;而 -F 选项分别使用 /(正斜杠)和 *(星号)突出表示目录和可执行文件 。)
命令 2 查找名称以点号开头的条目(即 .*) 。第 3 个命令仅查找那些单字母后缀的项目 。

推荐阅读