电脑技术学习

对话 UNIX: 掌握强大的命令行

dn001

  Shell 技巧

  通过一些功能强大的命令行组合,能明显提高您的工作效率。这些命令可以在所有的 shell 中工作,而不仅仅是 zsh。

  使用 tar 为任何目录创建包括符号链接在内的完整副本:

tar cf - /path/to/original | 
 (mkdir -p /path/to/copy; cd /path/to/copy; tar xvf -)

  第一个 tar 命令将目录 /path/to/original 进行归档并将归档文件写到 stdout,创建 (c) 选项后面使用的连字符 (-) 表示 stdout。括号中的命令为一个 subshell:subshell 中的命令不会影响当前 shell 的环境。mkdir -p 创建指定目录,包括任何需要创建的中间目录;cd 命令则切换到新目录。第二个 tar 命令从 stdin 读取归档文件并进行展开,展开 (x) 选项后面使用的连字号表示 stdin。

  要在保存命令序列的 stdout 同时进行查看,可使用 less -O file 。-O 选项会将 stdin 复制到指定的 file 中。如下例所示:

sort /etc/aliases | less -Osorted

  如果目录中包含数千个文件,则您的 shell(包括 zsh,取决于文件数目及其名称)可能无法使用通配符匹配来列举出所有文件,因为命令行通常具有一定的字符数限制。因此,类似以下 shell 脚本:

foreach i (*)
...
end

  可能会执行失败。(当超出允许命令行长度时,您可能看到类似 Line length exceeded 的消息。)如果出现此类错误,可使用管道 xargs 实用工具。xargs 命令可从管道中读取数据并为每行读取内容运行指定命令。

  例如,如果您要查找服务器上的所有引用 www.example.com 的网页,可使用以下命令行:

% find / -name '*HTML' -print
 | xargs grep -l 'www.example.com'
 | less -Opages

  xargs 接收来自 find 的文件名并重复运行 grep -l 以处理每个文件,而不论有多少个文件。(grep -l 在发现一个匹配项之后即打印文件的名称并停止在该文件中的进一步匹配。) less 允许您对结果进行分页并将列表保存在文件指定页中。命令结果为包含字符串“www.example.com的文件名列表。

  对话之旅正式开始

  本文为您介绍了有关 Unix shell 的基础知识。后续文章将更深入地讨论命令行工具的更多内容以及使用技巧。通过灵活运用 UNIX 命令行功能,可实现从文件系统到整个本地局域网的所有信息和系统管理的透明化。

标签: