xargs
tool as a filter for making good use of output culled from the find
command. The general precept is that a find
run provides a list of files that match some criteria. This list is passed on to xargs
, which then runs some other useful command with that list of files as arguments, as in the following example:Listing 1. Example of the classic use of the
xargs
tool~ $ find some-file-criteria some-file-path | \ > xargs some-great-command-that-needs-filename-arguments |
xargs
as just a helper for find
; it is one of those underutilized tools that, when you get into the habit of using it, you want to try on everything, including the following uses.Passing a space-delimited list
In its simplest invocation,
xargs
is like a filter that takes as input a list (with each member on a single line). The tool puts those members on a single space-delimited line:Listing 2. Example of output from the
xargs
tool~ $ xargs a b c Control-D a b c ~ $ |
You can send the output of any tool that outputs file names through
xargs
to get a list of arguments for some other tool that takes file names as an argument, as in the following example:Listing 3. Example of using of the
xargs
tool~/tmp $ ls -1 | xargs December_Report.pdf README a archive.tar mkdirhier.sh ~/tmp $ ls -1 | xargs file December_Report.pdf: PDF document, version 1.3 README: ASCII text a: directory archive.tar: POSIX tar archive mkdirhier.sh: Bourne shell script text executable ~/tmp $ |
The
xargs
command is useful for more than passing file names. Use it any time you need to filter text into a single line:Listing 4. Example of good habit #7: Using the
xargs
tool to filter text into a single line~/tmp $ ls -l | xargs -rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r--r-- 1 \ root root 238 Dec 03 08:19 README drwxr-xr-x 38 joe joe 354082 Nov 02 \ 16:07 a -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1 \ joe joe 3239 Sep 30 12:40 mkdirhier.sh ~/tmp $ |
Be cautious using
xargs
Technically, a rare situation occurs in which you could get into trouble using
xargs
. By default, the end-of-file string is an underscore (_); if that character is sent as a single input argument, everything after it is ignored. As a precaution against this, use the -e
flag, which, without arguments, turns off the end-of-file string completely.
Your use of xargs is dangerous. To see why read: http://en.wikipedia.org/wiki/Xargs#The_separator_problem
ReplyDeleteConsider using GNU Parallel http://www.gnu.org/software/parallel/ instead. Watch the intro video to GNU Parallel at http://www.youtube.com/watch?v=OpaiGYxkSuQ