How to Use the `xargs` Command in Linux: A Complete Guide
The xargs command is one of the most powerful and versatile utilities available in Unix/Linux systems. It builds and executes commands by reading arguments from standard input, effectively bridging the gap between commands that produce output and commands that consume arguments. Whether you are managing thousands of files, automating repetitive shell tasks, or constructing complex command pipelines, mastering xargs will dramatically improve your efficiency at the terminal.
In this comprehensive guide, we will cover how xargs works under the hood, walk through practical real-world examples, explain all essential options, and show you how to avoid common pitfalls.
What Is the xargs Command and How Does It Work?
At its core, xargs reads items from standard input (stdin) — typically separated by whitespace or newlines — and passes them as arguments to a specified command. This is critical because many Unix commands do not accept piped input directly as arguments; they expect arguments on the command line. xargs solves this problem elegantly.
The fundamental syntax is:
command | xargs [options] another_commandFor example, to find all .txt files in the current directory and delete them:
find . -name "*.txt" | xargs rmHere, find generates a list of .txt filenames and writes them to stdout. xargs reads that list and passes the filenames as arguments to rm, which then deletes them — all in a single, efficient operation.
> Why not just use rm $(find . -name "*.txt")? Command substitution can fail or behave unexpectedly when the argument list is extremely long or when filenames contain special characters. xargs handles both scenarios more safely and efficiently.
Basic Usage of xargs
Before diving into advanced examples, let's establish a clear understanding of the basic invocation pattern.
Passing a Simple List of Arguments
echo "file1.txt file2.txt file3.txt" | xargs touchThis command creates three files — file1.txt, file2.txt, and file3.txt — by passing all three names as arguments to touch. Without xargs, you would need to either type each filename manually or write a loop.
Verifying What xargs Will Execute
Before running a potentially destructive command, use the -t flag to print the constructed command to stderr before executing it:
echo "file1.txt file2.txt" | xargs -t rmOutput:
rm file1.txt file2.txtThis is invaluable for debugging pipelines before committing to execution.
Practical Examples of Using xargs
1. Deleting Files Found by find
One of the most common and powerful uses of xargs is combining it with find to delete files matching specific criteria:
find /var/log -name "*.log" -mtime +30 | xargs rmThis finds all .log files in /var/log that are older than 30 days and deletes them. This kind of automated cleanup is essential for server maintenance — something that administrators running VPS Hosting or Dedicated Servers deal with regularly to keep disk usage under control.
2. Limiting the Number of Arguments Per Execution with -n
By default, xargs passes as many arguments as possible to the command in a single invocation. The -n option lets you control exactly how many arguments are passed per execution:
echo "one two three four five six" | xargs -n 2 echoOutput:
one two
three four
five sixThis is particularly useful when a command has a limit on how many arguments it can accept, or when you want to process items in controlled batches.
3. Handling Filenames with Spaces and Special Characters Using -0
This is one of the most important safety practices when using xargs. Filenames containing spaces, newlines, or other special characters will break naive pipelines. The solution is to use find with -print0 (which separates filenames with null bytes instead of newlines) and xargs with -0:
find . -name "*.txt" -print0 | xargs -0 rmThe null byte (
