Replacement for xargs -d in osx

25

8

In Linux, you can use xargs -d, to quickly run the hostname command against four different servers with sequential names as follows:

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

It looks like the OSX xargs command does not support the delimiter parameter. Can you achieve the same result with a differently formatted echo, or through some other command-line utility?

Chase Seibert

Posted 2012-08-28T01:55:41.837

Reputation: 371

Answers

11

How about:

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

From man xargs:

-n number
Set the maximum number of arguments taken from standard input for each invocation of utility.

Gordon Davisson

Posted 2012-08-28T01:55:41.837

Reputation: 28 538

1If the values can contain spaces, linefeeds, or tabs, you could use something like printf 'a\0a' | xargs -0 -n1 echo. – Lri – 2012-10-18T07:20:01.310

46

Alternatively, you can always install GNU xargs through Homebrew and the GNU findutils package.

Install Homebrew:

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

Follow the instructions. Then install findutils:

brew install findutils

This will give you GNU xargs as gxargs, and you can use the syntax you're accustomed to from GNU/Linux. The same goes for other basic commands found in the findutils package such as gfind or glocate or gupdatedb, which have different BSD counterparts on OS X.

slhck

Posted 2012-08-28T01:55:41.837

Reputation: 182 472

Thank you! I did this, then added the path to my .zshrc (as explained in the installation output) so I wouldn't have to use the g prefix. – absynce – 2019-08-15T18:25:05.103

2

If you want it run in parallel, use GNU Parallel:

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

Ole Tange

Posted 2012-08-28T01:55:41.837

Reputation: 3 034

1

You can also use tr in OSX to convert the commas to new lines and use xargs to enumerate through each item as follows:

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

John

Posted 2012-08-28T01:55:41.837

Reputation: 161

0

with printf

$ printf '%s\n' 1 2 3 4 | xargs -I{} echo ssh root@www{}.example.com hostname
ssh root@www1.example.com hostname
ssh root@www2.example.com hostname
ssh root@www3.example.com hostname
ssh root@www4.example.com hostname

christian calloway

Posted 2012-08-28T01:55:41.837

Reputation: 1