Ersatz für xargs -d in osx

22

Unter Linux können Sie xargs -d,den hostnameBefehl wie folgt schnell für vier verschiedene Server mit aufeinander folgenden Namen ausführen :

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

Es sieht so aus, als ob der OSX-Befehl xargs den Parameter delimiter nicht unterstützt. Können Sie dasselbe Ergebnis mit einem anders formatierten echooder einem anderen Befehlszeilendienstprogramm erzielen ?

Chase Seibert
quelle

Antworten:

11

Wie wäre es mit:

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

Von man xargs:

-n number
Set the maximum number of arguments taken from standard input for each invocation of utility.
Gordon Davisson
quelle
1
Wenn die Werte Leerzeichen, Zeilenumbrüche oder Tabulatoren enthalten können, können Sie so etwas wie verwenden printf 'a\0a' | xargs -0 -n1 echo.
Lri
44

Alternativ können Sie GNU immer xargsüber Homebrew und das GNU- findutilsPaket installieren .

Installieren Sie Homebrew:

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

Folge den Anweisungen. Dann installiere findutils:

brew install findutils

Dies gibt Ihnen GNU xargsas gxargsund Sie können die Syntax verwenden, die Sie von GNU / Linux gewohnt sind. Gleiches gilt für andere grundlegende Befehle, die im findutils-Paket enthalten sind, z. B. gfindoder glocateoder gupdatedb, die unter OS X andere BSD-Entsprechungen haben.

slhck
quelle
Vielen Dank! Ich tat dies und fügte dann den Pfad zu meinem hinzu .zshrc(wie in der Installationsausgabe erklärt), damit ich das gPräfix nicht verwenden musste.
Absync
2

Wenn Sie möchten, dass es parallel läuft, verwenden Sie GNU Parallel:

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

Sie können trin OSX auch die Kommas in neue Zeilen konvertieren und mithilfe von xargs die einzelnen Elemente wie folgt auflisten:

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