Como posso fazer os xargs jogarem bem com o stdin?

7
$ seq 1 3
1
2
3
$ seq 1 3 | xargs echo
1 2 3
$

Mentalmente, substitua seq 1 3 por qualquer comando que liste entradas uma por linha no padrão. Como posso obter mais ou menos o que você espera, ou seja, as entradas em linhas separadas ( echo 1; echo 2; echo 3; )?

    
por Sean Allred 12.04.2015 / 19:51

2 respostas

14

Normalmente, xargs colocará vários argumentos em uma linha de comando. Para limitá-lo a um argumento por vez, use a opção -n :

$ seq 3 | xargs -n 1 echo
1
2
3

Documentação

De man xargs :

-n max-args
Use at most max-args arguments per command line. Fewer than max-args arguments will be used if the size (see the -s option) is exceeded, unless the -x option is given, in which case xargs will exit.

Diferença entre -n e -L

-L é semelhante, mas tem um recurso extra: ao contrário de -n , as linhas com espaços em branco finais continuam na próxima linha. Observe:

$ echo $'1 \n2\n3\n4'
1 
2
3
4
$ echo $'1 \n2\n3\n4' | xargs -L 1 echo
1 2
3
4
$ echo $'1 \n2\n3\n4' | xargs -n 1 echo
1
2
3
4
    
por 12.04.2015 / 19:59
6

Um pouco mais de pesquisa revelou a resposta de Faça xargs executar o comando uma vez para cada linha de entrada :

$ seq 1 3 | xargs -L 1 echo
1
2
3
    
por 12.04.2015 / 19:58