DEV Community

Cover image for How to use xargs on Linux
pikoTutorial
pikoTutorial

Posted on • Originally published at pikotutorial.com

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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 "{}"'
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Top comments (0)