comportamento xargs -I

comportamento xargs -I

Uma variável varcontém vários argumentos, cada um dividido por uma nova linha.

echo "$var" | xargs -I % echo ABC %
#Results in:
#ABC One
#ABC Two
#ABC Three

No entanto, ao omitir -Ie os %caracteres, recebo o seguinte:

echo "$var" | xargs echo ABC
#Results in:
#ABC One Two Three

Certa vez, li que {} substituiria o argumento atual (como find faz), mas isso não acontece. O que estou fazendo de errado?

Responder1

O comportamento usual xargsé colar tantos argumentos quanto possível na linha de comando de qualquer comando executado, iterando até terminar todos eles. Quando usado dessa forma, é uma solução para o problema das limitações de comprimento da linha de comando.

Mas quando você especifica a -Iopção, ele executa o comando em cada argumentoindividualmente, um por vez. Não acho que isso seja completamente óbvio na documentação da xargs -Iopção Linux, mas é isso que eles querem dizer.

-I replace-str
       Replace occurrences of replace-str in the initial-arguments with
       names read from standard input.  Also, unquoted  blanks  do  not
       terminate  input  items;  instead  the  separator is the newline
       character.  Implies -x and -L 1.

Responder2

Se você usar GNU Parallel em vez de xargs você poderá controlar qual comportamento deseja:

# 1 line at a time
echo "$var" | parallel echo ABC {}
# Many lines at a time (divided by # cpu)
echo "$var" | parallel -X echo ABC {} 
# Many lines at a time (not divided)
echo "$var" | parallel -Xj1 echo ABC {} 

Demora literalmente 10 segundos para instalar o GNU Parallel:

wget pi.dk/3 -qO - | sh -x

Assista aos vídeos de introdução para saber mais:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

informação relacionada