如何包含pipe道| 在我的Linuxfind-exec命令?
这不起作用。 这可以在发现? 还是我需要xargs?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
将pipe道符号解释为运行多个进程并将一个进程的输出传送到另一个进程的input的任务是shell(/ bin / sh或等价物)的责任。
在你的例子中,你可以select使用你的顶级shell来执行pipe道,如下所示:
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'
就效率而言,这个结果花费了一次调用查找,多次调用zcat以及调用一次agrep。
这将导致只产生一个单独的agrep进程,这个进程将处理由zcat的多次调用产生的所有输出。
如果由于某种原因想多次调用agrep,可以这样做:
find . -name 'file_*' -follow -type f \ -printf "zcat %p | agrep -dEOE 'grep'\n" | sh
这将使用要执行的pipe道构造一个命令列表,然后将这些命令发送到一个新的shell以实际执行。 (省略最后的“| sh”是debugging或执行像这样的命令行的干运行的好方法。)
在效率方面,这个结果花费了一次调用查找,一次调用sh,多次调用zcat以及大量调用agrep。
在命令调用次数方面,最有效的解决scheme是Paul Tomblin的build议:
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
…花费一次调用find,一次调用xargs,几次调用zcat和一次调用agrep。
解决scheme很简单:通过sh执行
... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
您也可以pipe道到一个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
循环包含多个引用传入的文件名的命令,用分号分隔,这些命令可以包含pipe道。 所以在这个例子中,我回显匹配文件的名称,然后列出归档过滤中给定类名称的内容。 输出如下所示:
/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
突出显示匹配的string; 这使得查找数百个被search的jar
文件列表变得非常简单,并且很容易看到任何匹配。
在Windows上,你可以做同样的事情:
for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableList
请注意,在Windows中,命令分隔符是'&'not';' 并且'@'抑制命令的回显,就像上面的linux find输出一样给出一个整齐的输出; 尽pipefindstr
不会使匹配的string变为粗体,所以您必须在输出处看起来更接近匹配的类名称。 事实certificate,Windows'for'命令知道了很多技巧,比如循环访问文本文件。
请享用