Zamiennik dla xargs -d w osx

22

W systemie Linux można użyć xargs -d,do szybkiego uruchomienia hostnamepolecenia na czterech różnych serwerach o następujących po sobie nazwach:

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

Wygląda na to, że polecenie xargs OSX nie obsługuje parametru separatora. Czy możesz osiągnąć ten sam wynik za pomocą innego sformatowania echolub innego narzędzia wiersza polecenia?

Chase Seibert
źródło

Odpowiedzi:

11

Co powiesz na:

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

Od man xargs:

-n number
Set the maximum number of arguments taken from standard input for each invocation of utility.
Gordon Davisson
źródło
1
Jeśli wartości mogą zawierać spacje, linie lub tabulatory, możesz użyć czegoś takiego printf 'a\0a' | xargs -0 -n1 echo.
Lri
45

Alternatywnie, zawsze możesz zainstalować GNU xargspoprzez Homebrew i findutilspakiet GNU .

Zainstaluj Homebrew:

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

Postępuj zgodnie z instrukcją. Następnie zainstaluj findutils:

brew install findutils

To da ci GNU xargsas gxargsi będziesz mógł użyć składni, do której jesteś przyzwyczajony z GNU / Linux. To samo dotyczy innych podstawowych poleceń znalezionych w pakiecie findutils, takich jak gfindlub glocatelub gupdatedb, które mają różne odpowiedniki BSD w OS X.

slhck
źródło
Dziękuję Ci! Zrobiłem to, a następnie dodałem ścieżkę do mojego .zshrc(jak wyjaśniono w danych wyjściowych instalacji), aby nie musiałem używać gprzedrostka.
absynce
2

Jeśli chcesz, aby działał równolegle, użyj GNU Parallel:

parallel ssh root@www{}.example.com hostname ::: {1..4}
Ole Tange
źródło
1

Możesz także użyć trw OSX do konwersji przecinków na nowe linie i użyć xargs do wyliczenia każdego elementu w następujący sposób:

echo -n 1,2,3,4 | tr -s ',' '\n' | xargs -I{} ssh root@www{}.example.com hostname
Jan
źródło