Una variable var
contiene 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 -I
y 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 xargs
es 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 -I
opció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 -I
opció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