要在当前工作目录下的文件夹层次结构中查找独特文件名的列表,您可在 shell 提示符下输入以下命令:
find . -type f -print | sort | uniq |
该命令行中组合了三种不同的实用工具:
-
find
对指定目录进行深度搜索,在本例中,是对从.
或 点(代表当前工作目录)开始的文件系统进行搜索并生成满足给定条件的所有项的名称。这里,-type f
告诉find
只查找文本文件。 - -print :True; print the full file name on the standard output, followed by a newline
-
sort
,顾名思义,将对列表进行处理并生成按字母排序的新列表。 -
uniq
(读做 “unique”),扫描列表,比较列表中的相邻元素,以去除任何重复项。例如,假设您具有以下列表: -
| sort | uniq 为不同的管道, sort 和uniq都是可以单独使用的unix 命令
感觉这几个图把管道描述得很清楚了*_*
图 3. UNIX 命令生成错误并输出到特殊通道,即标准错误设备
如图 3 中所示,多数 UNIX 命令从终端读取输入,将结果发送到终端,并将错误打印到终端上。默认情况下,除非另行指定,您的终端既是 stdin 的数据源,也是 stdout 和 stderr 的输出目标。
图 4 所示为 find . -type f -print | sort | uniq
命令的示意图。
图 4. 通过管道进行链接的三个实用工具的示意图
您常常会需要捕获 stdout 和 stderr。例如,如果您正在运行大型的数据挖掘任务,则可能要检查执行过程中的中间输出以及可能出现的任何错误。您可使用重定向语法的一些变种来实现该功能:
|&
,
>&
,
>>&
可分别对 stdout 和 stderr 实现管道、创建、附加功能。
图 6
所示为如何将 stdout 和 stderr 合并到单一的输出流。
图 6. 合并标准输出和标准错误设备
合并标准输出和标准错误的例子:
. zs.sh 1>/home/gsol/logs/download.log 2>&1
3.
xargs
(未试验)
可能会执行失败。(当超出允许命令行长度时,您可能看到类似 Line length exceeded
的消息。)如果出现此类错误,可使用管道 xargs
实用工具。xargs
命令可从管道中读取数据并为每行读取内容运行指定命令。
例如,如果您要查找服务器上的所有引用 www.example.com 的网页,可使用以下命令行:
% find / -name '*html' -print / |
xargs
接收来自 find
的文件名并重复运行 grep -l
以处理每个文件,而不论有多少个文件。(grep -l
在发现一个匹配项之后即打印文件的名称并停止在该文件中的进一步匹配。) less
允许您对结果进行分页并将列表保存在文件指定页中。命令结果为包含字符串“www.example.com”的文件名列表。
4.重定向:
包括 Bourne shell (bash
) 和 Korn shell (ksh
) 在内的多数现代 UNIX shell 都支持这里提到的重定向功能,尽管在这些 shell 中具体语法可能存在细微差别
[gl@server xiuyun]$ bash < tellme.txt >dd.log 2>&1
2>&1:表示把standout 和standerr 整合,作为standout输出。
这样执行的结果都会输出到dd.log中,如果不加上2>&1,正确的输出会到dd.log中,错误会在前台打印。注意“2>&1”写法,中间没有任何空格哦
bash$ ls tellme bash$ cat tellme echo Your current login, working directory, and system are... whoami pwd systemname bash$ bash < tellme |& tee log Your current login and working directory are... strike /home/strike bash: systemname: command not found bash$ ls tellme log bash$ cat log Your current login and working directory are strike /home/strike(note: stdout) bash: systemname: command not found (note: stderr) |
尽管 UNIX shell 具有较高的专用性,且通常使用键盘进行交互,但某些 shell 如 bash 等也能从文件读取输入内容。(实际上,stdin 也是一种文件。)在前面的片段中,
短语 bash < commands 告诉 bash 执行在文件 tellme 中找到的命令列表。
短语 |&tee log 将 bash 的 stdout 和 stderrto 通过管道重定向到 tee 实用工具,
后者将其 stdin 打印到 stdout 和 文件 log 中。
但是,如果您打算使用 bash 来处理多个文件,该怎么办呢?cat file1 file2 file3 | bash 是一种可行的方法,