Uma variável var
conté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 -I
e 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 -I
opção, ele executa o comando em cada argumentoindividualmente, um por vez. Não acho que isso seja completamente óbvio na documentação da xargs -I
opçã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