How to use xargs on Linux?


Welcome to the next pikoTutorial!

xargs reads items from standard input, delimited by blanks or newlines and executes the specified command with those items as arguments.

Basic usage

The most basic pattern of using xargs commands consists of 4 elements:

  • first command which generates some output
  • pipe operator
  • xargs
  • second command which consumes as an input the output from the first command
first_command | xargs second_command

Examples

Create files basing on a text file

Let’s assume you have the following list.txt text file:

file1.txt
file2.cpp
file3.py

You can quickly create these files basing directly on that file by combining cat with touch with help of xargs:

cat list.txt | xargs touch

In this case each file name listed in the file becomes an input argument for touch command. If you have large amount of data to process, you can add -P option which allows to specify the number of processes to run:

cat list.txt | xargs -P 8 touch

Concatenate content of multiple files

If you want to find all the .txt files and merge them into one combined.txt file, run:

find -name "*.txt" | xargs cat > combined.txt

Note for beginners: if you have files with spaces or special characters in their names, this simple version of the command will fail. To avoid this issue, you must use xargs with -0 option like this: find . -name "*.txt" -print0 | xargs -0 cat > combined.txt.

Combine multiple commands with subshell

If you want to execute multiple commands on a single item, just use sh command. Inside the shell you can access the item value using curly braces {}.

cat combined.txt | xargs -I "{}" sh -c 'echo Started processing "{}"; echo Processing...; echo Processed "{}"'

Note for advanced: use quotes arround curly brackets to avoid e.g. command injection because by default the input is not sanitized in any way.

Archiving multiple files

To archive all the .csv files, run:

find -name "*.csv" | xargs tar -cvf archive.tar