xargs -I comportamiento

xargs -I comportamiento

Una variable varcontiene múltiples argumentos, cada uno dividido por una nueva línea.

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

Sin embargo, al omitir -Iy los %caracteres, obtengo lo siguiente:

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

Una vez leí que {} sustituiría el argumento actual (como lo hace find), pero eso no sucede. ¿Qué estoy haciendo mal?

Respuesta1

El comportamiento habitual de xargses pegar tantos argumentos como sea posible en la línea de comando de cualquier comando que ejecute, iterando hasta terminar con todos. Cuando se usa de esta manera, es una solución al problema de las limitaciones de longitud de la línea de comando.

Pero cuando especifica la -Iopción, ejecuta el comando en cada argumento.individualmente, uno a la vez. No creo que eso sea completamente obvio en la documentación de la xargs -Iopción de Linux, pero eso es lo que quieren decir.

-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.

Respuesta2

Si usa GNU Parallel en lugar de xargs, puede controlar qué comportamiento desea:

# 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 {} 

Se necesitan literalmente 10 segundos para instalar GNU Parallel:

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

Mire los videos de introducción para obtener más información:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

información relacionada