Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

xargs

Is a very useful program to take a list and run commands against that list. xargs will take a list of arguments, loop through them and run a command against 1 or more arguments at a time.

If you like xargs you might want to check out GNU Parallel.

Basic Example

Here is a really straightforward example of using xargs to calculate a MD5 hash on every file in the current directory,

ls | xargs -t -n1 md5

This is how it works,

  • -t will show you what xargs is about to execute before it executes it.
  • -n1 specifies that xarg work with he arguments passed by the directory to x arguments at a time, in this case one argument at a time.

Thanks to the -t the output will be shown on screen,

md5 planetary.doc
MD5 (bash) = ab5970d50d67bcafe5c554387f76534e
md5 Superman.jpg
MD5 (cat) = cdefa50d737dfcf8dc57886ea1a758c4

Substitution to Rename Files

Now let's get more advanced and use -I to allow substitution. First we'll create a some temporary files,

mkdir temp
cd temp
touch files1 file2 file3 # Creates 3 empty files

Now using xargs we will add the txt extension to each file,

ls | xargs -t -I {} mv {} {}.txt
mv file1 file1.txt
mv file2 file2.txt
mv file3 file3.txt

The -I {} specifies that the arguments by ls will be placed in the location of the {} called the replacement string. In fact you can use whatever variable name you want instead of {}. For example, the following will also work,

ls | xargs -t -I varX md5 varX
md5 file1.txt
MD5 (file1.txt) = d41d8cd98f00b204e9800998ecf8427e
md5 file2.txt
MD5 (file2.txt) = d41d8cd98f00b204e9800998ecf8427e
md5 file3.txt
MD5 (file3.txt) = d41d8cd98f00b204e9800998ecf8427e

One item I don't understand yet is why {} forces arguments to be iterated through one at a time. Also, how would we allow more than one argument? -n2 will not work.

Debugging xargs with echo

The echo command is useful to test and see what xargs will be looping through,

ls | xargs -I {} echo "mv {} {}.txt"
mv file1 file1.txt
mv file2 file2.txt
mv file3 file3.txt

Useful Applications of xargs

Search - ...

  • No labels