Substituição para xargs -d em osx

22

No Linux, você pode xargs -d,executar rapidamente o hostnamecomando em quatro servidores diferentes com nomes sequenciais, da seguinte maneira:

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

Parece que o comando OSX xargs não suporta o parâmetro delimitador. Você pode obter o mesmo resultado com um formato diferente echoou através de algum outro utilitário de linha de comando?

Chase Seibert
fonte

Respostas:

11

E se:

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
fonte
1
Se os valores puderem conter espaços, linhas de alimentação ou tabulações, você pode usar algo parecido printf 'a\0a' | xargs -0 -n1 echo.
Lri 18/10/12
44

Como alternativa, você sempre pode instalar o GNU xargsatravés do Homebrew e do findutilspacote GNU .

Instale o Homebrew:

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

Siga as instruções. Em seguida, instale o findutils:

brew install findutils

Isso fornecerá o GNU xargscomo gxargse você pode usar a sintaxe à qual está acostumado no GNU / Linux. O mesmo vale para outros comandos básicos encontrados no pacote findutils, como gfindor glocateou gupdatedb, que possuem diferentes versões do BSD no OS X.

slhck
fonte
Obrigado! Fiz isso e adicionei o caminho ao meu .zshrc(conforme explicado na saída da instalação) para não precisar usar o gprefixo.
absynce
2

Se você deseja que ele seja executado em paralelo, use o GNU Parallel:

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

Você também pode usar trno OSX para converter as vírgulas em novas linhas e usar xargs para enumerar cada item da seguinte maneira:

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