Reemplazo para xargs -d en osx

22

En Linux, puede usar xargs -d,para ejecutar rápidamente el hostnamecomando contra cuatro servidores diferentes con nombres secuenciales de la siguiente manera:

echo -n 1,2,3,4 |xargs -d, -I{} ssh root@www{}.example.com hostname

Parece que el comando OSX xargs no admite el parámetro delimitador. ¿Puede lograr el mismo resultado con un formato diferente echoo mediante alguna otra utilidad de línea de comandos?

Chase Seibert
fuente

Respuestas:

11

Qué tal si:

echo {1..4} | xargs -n1 -I{} ssh root@www{}.example.com hostname

De man xargs:

-n number
Set the maximum number of arguments taken from standard input for each invocation of utility.
Gordon Davisson
fuente
1
Si los valores pueden contener espacios, saltos de línea o pestañas, podría usar algo como printf 'a\0a' | xargs -0 -n1 echo.
Lri
44

Alternativamente, siempre puede instalar GNU a xargstravés de Homebrew y el findutilspaquete GNU .

Instalar Homebrew:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Sigue las instrucciones. Luego instale findutils:

brew install findutils

Esto le dará GNU xargscomo gxargs, y puede usar la sintaxis a la que está acostumbrado desde GNU / Linux. Lo mismo ocurre con otros comandos básicos que se encuentran en el paquete findutils, como gfindor glocateo gupdatedb, que tienen contrapartidas BSD diferentes en OS X.

slhck
fuente
¡Gracias! Hice esto, luego agregué la ruta a mi .zshrc(como se explica en la salida de instalación) para no tener que usar el gprefijo.
ausencia
2

Si desea que se ejecute en paralelo, use GNU Parallel:

parallel ssh root@www{}.example.com hostname ::: {1..4}
Ole Tange
fuente
1

También puede usar tren OSX para convertir las comas en nuevas líneas y usar xargs para enumerar cada elemento de la siguiente manera:

echo -n 1,2,3,4 | tr -s ',' '\n' | xargs -I{} ssh root@www{}.example.com hostname
John
fuente