Corrigido último argumento com xargs

2

É possível usar xargs para invocar um comando para que o último argumento do comando seja corrigido?

Minha tentativa:

printf '%s\n' a b c d | xargs -I{} echo {} LAST

acaba fazendo

echo a LAST  
echo b LAST  
echo c LAST  
echo d LAST  

Eu quero que o xargs invoque

echo a b c d LAST
#fit as many as you can but always finish wiht LAST

Isso é possível, preferencialmente de maneira portátil?

    
por PSkocik 01.09.2018 / 15:21

2 respostas

4

tl; dr; é assim que você pode fazê-lo portavelmente, sem -I e outras opções sofisticadas quebradas:

$ echo a b c d f g | xargs -n 2 sh -c 'echo "$@" LAST' sh
a b LAST
c d LAST
f g LAST

$ seq 1 100000 | xargs sh -c 'echo "$#" LAST' sh
23692 LAST
21841 LAST
21841 LAST
21841 LAST
10785 LAST

O problema com a opção -I é que ele está quebrado por design e não há como evitar isso:

$ echo a b c d f g | xargs -I {} -n 1 echo {} LAST
a b c d f g LAST
$ echo a b c d f g | xargs -I {} -n 2 echo {} LAST
{} LAST a b
{} LAST c d
{} LAST f g

Mas eles provavelmente estão cobertos, porque é o que o padrão diz:

-I replstr ^[XSI] [Option Start] Insert mode: utility is executed for each line from standard input, taking the entire line as a single argument, inserting it in arguments for each occurrence of replstr.

E isso não diz nada sobre a interação com as opções -n e -d, então elas estão livres para fazer o que quiserem.

É assim em um (mais antigo) FreeBSD, menos inesperado, mas não padrão:

fzu$ echo a b c d f g | xargs -I {} -n 2 echo {} LAST
a b LAST
c d LAST
f g LAST
fzu$ echo a b c d f g | xargs -I {} -n 1 echo {} LAST
a LAST
b LAST
c LAST
d LAST
f LAST
g LAST
    
por 01.09.2018 / 17:12
-2

Não com xargs (sozinho). Se você tem uma lista de itens de comprimento imprevisível, como deve xargs saber desde o início (= primeiro elemento) qual elemento seria o último? Você precisará de alguns lógicos adicionais para separar o elemento desejado dos outros.

    
por 01.09.2018 / 18:15

Tags