xargs
pode não se comportar como você espera. Veja o comentário de @ MichaelHomer a esta pergunta:
xargs mv mfoo foo
will wait for input and run mv mfoo foo $x_1 $x_2 $x_3...
for every line $x_n
of input it gets. @MichaelHomer
Isso pode ser confirmado lendo o xargs
página do manual :
DESCRIPTION
The xargs utility reads space, tab, newline and end-of-file delimited strings from the standard input
and executes utility with the strings as arguments.
Na prática, parece que xargs
irá ignorar novas linhas quando alimentando argumentos para o utilitário de linha de comando dado como seu primeiro argumento. Por exemplo, observe o que acontece com a nova linha:
$ echo "foo bar\ncat dog"
foo bar
cat dog
$ echo "foo bar\ncat dog" | xargs echo
foo bar cat dog
Esse comportamento pode ser controlado com o -n
sinalizador :
-n number
Set the maximum number of arguments taken from standard input for
each invocation of utility.
Voltando ao exemplo anterior, se quiséssemos que xargs
aceitasse apenas 2 args, então parássemos então podemos usar a abordagem @ ddnomad :
$ echo "foo bar\ncat dog" | xargs -n 2 echo
foo bar
cat dog
Além disso, conforme mostrado nos comentários da resposta do Rakesh Sharma, no BSD xargs
você pode especificar o número de linhas a serem lidas com o -L
flag. Na página do manual:
-L number
Call utility for every number lines read. If EOF is reached and
fewer lines have been read than number then utility will be called
with the available lines.
Igualmente útil para o teste é a alteração -t
:
Revisitando nosso exemplo, os dois seguintes funcionarão; no entanto, o segundo exemplo é melhor porque é o que pretendia neste caso:
$ echo "foo bar\ncat dog" | xargs -n 2 echo
foo bar
cat dog
$ echo "foo bar\ncat dog" | xargs -L 1 echo
foo bar
cat dog
Nota na página do manual:
The -L and -n options are mutually exclusive; the last one given will be used.