Answers:
将管道符号解释为运行多个进程并将一个进程的输出通过管道传递到另一个进程的输入的指令是外壳程序的职责(/ bin / sh或等效命令)。
在您的示例中,您可以选择使用顶级外壳执行管道,如下所示:
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'
就效率而言,此结果花费了find的一次调用,zcat的多次调用和agrep的一次调用。
这将导致仅产生一个agrep进程,该进程将处理zcat多次调用产生的所有输出。
如果出于某种原因您想多次调用agrep,则可以执行以下操作:
find . -name 'file_*' -follow -type f \
-printf "zcat %p | agrep -dEOE 'grep'\n" | sh
这使用管道构造了要执行的命令列表,然后将这些命令发送到新的外壳以实际执行。(省略最后的“ | sh”是调试或执行此类命令行的不错的方法。)
就效率而言,此结果花费了find的一次调用,sh的一次调用,zcat的多次调用和agrep的多次调用。
就命令调用次数而言,最有效的解决方案是Paul Tomblin的建议:
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
...花费了find的一次调用,xargs的一次调用,zcat的几次调用和agrep的一次调用。
-exec sh -c "… | … " \;
。
解决方案很容易:通过sh执行
... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;
-c
选项。否则,您会收到令人费解的No such file or directory
错误消息。
find -type f -name '*.mdds' -exec sh -c "echo {} | sed -e 's/_[0-9]\+//g' | xargs mv {}" \;
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
您还可以通过管道传递到while
循环,该循环可以对find
找到的文件执行多个操作。因此,这里是用于在jar
存档中查找包含大量jar
文件发行版的文件夹中给定的Java类文件的工具
find /usr/lib/eclipse/plugins -type f -name \*.jar | while read jar; do echo $jar; jar tf $jar | fgrep IObservableList ; done
关键是while
循环包含多个引用传入文件名的命令,这些命令用分号分隔,这些命令可以包含管道。因此,在该示例中,我回显匹配文件的名称,然后列出给定类名的存档过滤中的内容。输出如下:
/usr/lib/eclipse/plugins/org.eclipse.core.contenttype.source_3.4.1.R35x_v20090826-0451.jar /usr/lib/eclipse/plugins/org.eclipse.core.databinding.observable_1.2.0.M20090902-0800 .jar org / eclipse / core / databinding / observable / list / IObservableList .class /usr/lib/eclipse/plugins/org.eclipse.search.source_3.5.1.r351_v20090708-0800.jar / usr / lib / eclipse / plugins / org.eclipse.jdt.apt.core.source_3.3.202.R35x_v20091130-2300.jar /usr/lib/eclipse/plugins/org.eclipse.cvs.source_1.0.400.v201002111343.jar / usr / lib / eclipse / plugins / org.eclipse.help.appserver_3.1.400.v20090429_1800.jar
在我的bash shell(xubuntu10.04 / xfce)中,确实使匹配的类名加粗,因为fgrep
高亮显示了匹配的字符串;这使得扫描数百个jar
文件列表变得非常容易,并且可以轻松查看任何匹配项。
在Windows上,您可以执行以下操作:
for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableList
请注意,在Windows上,命令分隔符是'&'而不是';' 就像上面的linux find输出一样,“ @”抑制了命令的回显以提供整洁的输出;尽管findstr
未将匹配的字符串设为粗体,所以您必须在输出处稍微看一点才能看到匹配的类名。事实证明,Windows的“ for”命令知道许多技巧,例如循环遍历文本文件...
请享用
我发现运行字符串shell命令(sh -c)效果最佳,例如:
find -name 'file_*' -follow -type f -exec bash -c "zcat \"{}\" | agrep -dEOE 'grep'" \;