example use of xargs
application in Unix can be something like this:
ls | xargs echo
which is the same as (let's say I have someFile
and someDir/
in the working directory):
echo someFile someDir
so xargs
take its input and place it at the end of the next command (here at the end of echo).
But sometimes I want xargs
to place its input somewhere in the middle of next command.
For example:
find . -type f -name "*.cpp" -print | xargs g++ -o outputFile
so if I had in the current directory files a.cpp
, b.cpp
, c.cpp
the output would be the same as with the command:
g++ -o outputFile a.cpp b.cpp c.cpp
but I want to have something like this:
g++ a.cpp b.cpp c.cpp -o outputFile
Is there a way to do it?
P.S.: I need it in some cases, because e.g.:
i586-mingw32msvc-g++ -o outputFile `pkg-config --cflags --libs gtkmm-2.4` a.cpp b.cpp c.cpp
doesn't work but this one works fine:
i586-mingw32msvc-g++ a.cpp b.cpp c.cpp -o outputFile `pkg-config --cflags --libs gtkmm-2.4`
GNU Parallel http://www.gnu.org/software/parallel/ would be a solution too:
To answer the original question asked in the title of how to use
xargs
with the input in the middle rather than the end:This replaces
{}
in the command with the piped output. There are some subtle differences between BSD and GNU xargs described below:BSD xargs (e.g. on MacOS/Darwin, freebsd)
Use
-I REPLACE
, which will replace the stringREPLACE
(or whatever you pass) in the command. For example:The man page describes the option:
GNU xargs (e.g. on Linux)
Use either the
-I REPLACE
or the the-i
argument, which the man page describes:The
-L 1
on-I
means that it will execute each of the input in a separate command:(
-i
does not have this effect, though is apparently deprecated.)If your version of xargs doesn't include the
-I
feature, an alternative is to write a little shell script containing the command you want to execute:Then use xargs to run that:
You do not need
xargs
for this. Just use: