xargs is a command on Unix and most Unix-like operating systems used to build and execute command lines from standard input. Commands like grep
and awk
can accept the standard input as a parameter, or argument by using a pipe. However others like cp
and echo
disregard the standard input stream and rely solely on the arguments found after the command . Additionally, under the Linux kernel before version 2.6.23, arbitrarily long lists of parameters could not be passed to a command, so xargs
breaks the list of arguments into sublists small enough to be acceptable.
For example, commands like:
rm /path/*or
rm `find /path -type f`will fail with an error message of "Argument list too long" if there are too many files in /path
.
However the version below (functionally equivalent to rm `find /path -type f`
) will not fail:
In the above example, the find
utility feeds the input of xargs
with a long list of file names. xargs
then splits this list into sublists and calls rm
once for every sublist.
The previous example is more efficient than this functionally equivalent version which calls rm
once for every single file:
Note however that with modern versions of find
, the following variant does the same thing as the xargs
version:
xargs often covers the same functionality as the backquote (`) feature of many shells, but is more flexible and often also safer, especially if there are blanks or special characters in the input. It is a good companion for commands that output long lists of files like find
, locate
and grep
, but only if you use -0
, since xargs
without -0
deals badly with file names containing ', " and space. GNU Parallel is the perfect companion to find, locate and grep if file names may contain ', " and space (newline still requires -0
).
Read more about Xargs: The Separator Problem