Penggantian untuk xargs -d di osx

22

Di Linux, Anda dapat menggunakan xargs -d,untuk menjalankan hostnameperintah dengan cepat terhadap empat server berbeda dengan nama sekuensial sebagai berikut:

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

Sepertinya perintah xargs OSX tidak mendukung parameter pembatas. Bisakah Anda mencapai hasil yang sama dengan diformat berbeda echo, atau melalui beberapa utilitas baris perintah lainnya?

Chase Seibert
sumber

Jawaban:

11

Bagaimana tentang:

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

Dari man xargs:

-n number
Set the maximum number of arguments taken from standard input for each invocation of utility.
Gordon Davisson
sumber
1
Jika nilainya dapat berisi spasi, umpan garis, atau tab, Anda bisa menggunakan sesuatu seperti printf 'a\0a' | xargs -0 -n1 echo.
Lri
44

Atau, Anda selalu dapat menginstal GNU xargsmelalui Homebrew dan findutilspaket GNU .

Instal Homebrew:

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

Ikuti petunjuk. Kemudian instal findutils:

brew install findutils

Ini akan memberi Anda GNU xargssebagai gxargs, dan Anda dapat menggunakan sintaks yang biasa Anda gunakan dari GNU / Linux. Hal yang sama berlaku untuk perintah dasar lain yang ditemukan dalam paket findutils seperti gfindatau glocateatau gupdatedb, yang memiliki rekan BSD yang berbeda pada OS X.

slhck
sumber
Terima kasih! Saya melakukan ini, kemudian menambahkan path ke saya .zshrc(seperti yang dijelaskan dalam output instalasi) jadi saya tidak perlu menggunakan gawalan.
absynce
2

Jika Anda ingin dijalankan secara paralel, gunakan GNU Parallel:

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

Anda juga dapat menggunakan trOSX untuk mengonversi koma ke baris baru dan menggunakan xargs untuk menghitung melalui setiap item sebagai berikut:

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