como melhor enviar a saída de um comando find + exec para um pipeline?

2

Eu gostaria de entender como enviar corretamente a saída de um comando find + exec para um pipeline para processamento adicional.

i.e. como podemos nós (1) selecione um arquivo de grupo
(2) executar alguma operação no grupo via exec e
(3) usar a saída dessa operação como entrada para 1 ou mais filtros em um pipeline

Por exemplo, quando tento filtrar um comando find + exec como esse, vejo muitos erros 'terminados por sinal 13' para as linhas que eu filtrava.

$ find c* -name "*.jpg" -exec ls {} \; | head
c0/1467058201899.jpg
c0/1465854461118.jpg
c0/1465855196637.jpg
c0/1467050962421.jpg
c0/1465856476225.jpg
c0/1467050385287.jpg
c0/1465853696999.jpg
c0/1467144293032.jpg
c0/1467051637981.jpg
c0/1465841226352.jpg
find: 'ls' terminated by signal 13
find: 'ls' terminated by signal 13
find: 'ls' terminated by signal 13
...

Eu posso fazer com que esse erro particular desapareça, mas isso não parece muito elegante.

$ find c* -name "*.jpg" -exec ls {} \; -print 2>/dev/null | head
c0/1467058201899.jpg
c0/1467058201899.jpg
c0/1465854461118.jpg
c0/1465854461118.jpg
c0/1465855196637.jpg
c0/1465855196637.jpg
c0/1467050962421.jpg
c0/1467050962421.jpg
c0/1465856476225.jpg
c0/1465856476225.jpg

Existe uma maneira mais elegante de fazer isso para o caso geral de find + exec, em que o comando executado pode variar?

UPDATE
usando xargs ainda parece gerar saída para stderr ...

$ find c* -name "*.jpg" -print0 | xargs -0 ls | head
c0/1465425913832.jpg
c0/1465425968779.jpg
c0/1465426112741.jpg
c0/1465426116540.jpg
c0/1465426121623.jpg
c0/1465426127656.jpg
c0/1465426133584.jpg
c0/1465426140097.jpg
c0/1465426143185.jpg
c0/1465426156715.jpg
xargs: ls: terminated by signal 13

usando find + exec terminando com + ao invés de; também gera saída para stderr ...

$ find c* -name "*.jpg" -exec ls {} \+ | head
c0/1465425913832.jpg
c0/1465425968779.jpg
c0/1465426112741.jpg
c0/1465426116540.jpg
c0/1465426121623.jpg
c0/1465426127656.jpg
c0/1465426133584.jpg
c0/1465426140097.jpg
c0/1465426143185.jpg
c0/1465426156715.jpg
find: 'ls' terminated by signal 13
find: 'ls' terminated by signal 13

embora adicionar "-print 2 > / dev / null" a este comando resulte em um comando que executa muito rapidamente ...

$ find c* -name "*.jpg" -exec ls {} \+ -print 2>/dev/null | head
c0/1467058201899.jpg
c0/1465854461118.jpg
c0/1465855196637.jpg
c0/1467050962421.jpg
c0/1465856476225.jpg
c0/1467050385287.jpg
c0/1465853696999.jpg
c0/1467144293032.jpg
c0/1467051637981.jpg
c0/1465841226352.jpg
    
por Alex Ryan 13.07.2016 / 00:06

1 resposta

3

O erro está ocorrendo porque find não sabe quando parar. Se você executar find | head , quando a cabeça obtiver suas dez linhas e saídas, na próxima vez que find tentar escrever um nome de arquivo, ele terá um SIGPIPE (informando que a outra extremidade do o tubo está quebrado ou fechado), e encontrar irá sair graciosamente.

Mas aqui, encontre não está escrevendo nada, ls is. find pode ver que seus filhos estão morrendo e pode ver por quê, mas não sabe que a outra extremidade do tubo está fechada e não sabe parar de gerá-los.

    
por 13.07.2016 / 00:15

Tags