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