Respostas:
A tarefa de interpretar o símbolo de canal como uma instrução para executar vários processos e canalizar a saída de um processo para a entrada de outro processo é de responsabilidade do shell (/ bin / sh ou equivalente).
No seu exemplo, você pode optar por usar seu shell de nível superior para executar a tubulação da seguinte maneira:
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'
Em termos de eficiência, esses resultados custam uma invocação de localização, inúmeras invocações de zcat e uma invocação de concordância.
Isso resultaria em apenas um único processo de aprovação que processaria toda a saída produzida por inúmeras invocações do zcat.
Se, por algum motivo, você desejar invocar o consentimento várias vezes, poderá:
find . -name 'file_*' -follow -type f \
-printf "zcat %p | agrep -dEOE 'grep'\n" | sh
Isso constrói uma lista de comandos usando pipes para executar, depois os envia para um novo shell para realmente ser executado. (Omitir o "| sh" final é uma boa maneira de depurar ou executar execuções secas de linhas de comando como essa.)
Em termos de eficiência, esses resultados custam uma invocação de localização, uma invocação de sh, inúmeras invocações de zcat e inúmeras invocações de concordância.
A solução mais eficiente em termos de número de chamadas de comando é a sugestão de Paul Tomblin:
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
... que custa uma invocação de localização, uma invocação de xargs, algumas invocações de zcat e uma invocação de concordância.
-exec sh -c "… | … " \;
.
a solução é fácil: execute via sh
... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;
-c
opção. Caso contrário, você receberá uma No such file or directory
mensagem de erro intrigante .
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'
Você também pode canalizar para um while
loop que pode executar várias ações no arquivo find
localizado. Então, aqui está um para procurar nos jar
arquivos um determinado arquivo de classe java na pasta com uma grande distribuição de jar
arquivos
find /usr/lib/eclipse/plugins -type f -name \*.jar | while read jar; do echo $jar; jar tf $jar | fgrep IObservableList ; done
o ponto principal é que o while
loop contém vários comandos que referenciam o nome do arquivo passado separado por ponto-e-vírgula e esses comandos podem incluir canais. Portanto, nesse exemplo, eu ecoo o nome do arquivo correspondente e listo o que está no filtro de archive para um determinado nome de classe. A saída se parece com:
/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
no meu shell bash (xubuntu10.04 / xfce), ele realmente torna o nome da classe correspondente em negrito, pois fgrep
destaca a string correspondente; isso facilita muito a varredura da lista de centenas de jar
arquivos pesquisados e a visualização fácil de quaisquer correspondências.
no Windows, você pode fazer o mesmo com:
for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableList
observe que, no Windows, o separador de comandos é '&' not ';' e que o '@' suprime o eco do comando para fornecer uma saída organizada, assim como o linux encontra a saída acima; apesar de findstr
não tornar a string correspondente em negrito, você deve olhar um pouco mais de perto a saída para ver o nome da classe correspondente. Acontece que o comando 'for' do Windows conhece alguns truques, como percorrer arquivos de texto ...
desfrutar
Eu descobri que a execução de um comando shell de string (sh -c) funciona melhor, por exemplo:
find -name 'file_*' -follow -type f -exec bash -c "zcat \"{}\" | agrep -dEOE 'grep'" \;
Se você está procurando uma alternativa simples, isso pode ser feito usando um loop:
for i in $(find -name 'file_*' -follow -type f);do zcat $i | agrep -dEOE 'grep');done
ou, de forma mais geral e fácil de entender:
for i in $(YOUR_FIND_COMMAND);do YOUR_EXEC_COMMAND_AND_PIPES );done
e substitua qualquer {} por $ i em YOUR_EXEC_COMMAND_AND_PIPES