Замена для xargs -d в osx

22

В Linux вы можете xargs -d,быстро запустить hostnameкоманду на четырех разных серверах с последовательными именами следующим образом:

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

Похоже, что команда OSX xargs не поддерживает параметр разделителя. Можете ли вы достичь того же результата с другим форматированием echoили с помощью какой-либо другой утилиты командной строки?

Чейз Сейберт
источник

Ответы:

11

Как насчет:

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

От man xargs:

-n number
Set the maximum number of arguments taken from standard input for each invocation of utility.
Гордон Дэвиссон
источник
1
Если значения могут содержать пробелы, переводы строки или табуляции, вы можете использовать что-то вроде printf 'a\0a' | xargs -0 -n1 echo.
Lri
45

Кроме того, вы всегда можете установить GNU xargsчерез Homebrew и findutilsпакет GNU .

Установите Homebrew:

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

Следуй инструкциям. Затем установите findutils:

brew install findutils

Это даст вам GNU xargsas gxargs, и вы сможете использовать синтаксис, к которому вы привыкли из GNU / Linux. То же самое касается других базовых команд, найденных в пакете findutils, таких как gfindили glocateили gupdatedb, которые имеют разные аналоги BSD в OS X.

slhck
источник
Спасибо! Я сделал это, затем добавил путь к моему .zshrc(как объяснено в выводе установки), чтобы мне не пришлось использовать gпрефикс.
возрождение
2

Если вы хотите, чтобы он работал параллельно, используйте GNU Parallel:

parallel ssh root@www{}.example.com hostname ::: {1..4}
Оле Танге
источник
1

Вы также можете использовать trв OSX для преобразования запятых в новые строки и использовать xargs для перечисления каждого элемента следующим образом:

echo -n 1,2,3,4 | tr -s ',' '\n' | xargs -I{} ssh root@www{}.example.com hostname
Джон
источник