xargs -I behavior

1

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

Uma vez eu li {}, substituo o argumento atual (como o find), mas isso não acontece. O que estou fazendo errado?

    
por David Stockinger 25.02.2013 / 18:24

2 respostas

3

O comportamento usual de xargs é colar o máximo de argumentos possível na linha de comando de qualquer comando executado, iterando até que todos sejam executados. Quando usado dessa maneira, é uma solução para o problema das limitações de tamanho da linha de comando.

Mas quando você especifica a opção -I , ele executa o comando em cada argumento individualmente , um por vez. Eu não acho que isso seja completamente óbvio na documentação da opção xargs -I do Linux, mas é isso que eles significam.

-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.
    
por 25.02.2013 / 19:44
0

Se você usar o GNU Parallel em vez de xargs, 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 {} 

Leva 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: link

    
por 20.04.2013 / 00:42

Tags