Isso não está funcionando. Isso pode ser feito em busca? Ou preciso xargs?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
fonte
Isso não está funcionando. Isso pode ser feito em busca? Ou preciso xargs?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
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
fonte
-c
opção. Caso contrário, você receberá umaNo 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 {}" \;
fonte
Você também pode canalizar para um
while
loop que pode executar várias ações no arquivofind
localizado. Então, aqui está um para procurar nosjar
arquivos um determinado arquivo de classe java na pasta com uma grande distribuição dejar
arquivoso 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 dejar
arquivos pesquisados e a visualização fácil de quaisquer correspondências.no Windows, você pode fazer o mesmo com:
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
fonte
Eu descobri que a execução de um comando shell de string (sh -c) funciona melhor, por exemplo:
fonte
Se você está procurando uma alternativa simples, isso pode ser feito usando um loop:
ou, de forma mais geral e fácil de entender:
e substitua qualquer {} por $ i em YOUR_EXEC_COMMAND_AND_PIPES
fonte