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