How to use the command `xargs` (with examples)
The xargs
command is a powerful utility in UNIX and UNIX-like operating systems used to build and execute command lines from standard input. Essentially, xargs
reads data from standard input and executes a command using this data as arguments. It intelligently handles input such as output from another command or lines from a file and transforms them into arguments for a specified command. xargs
greatly enhances the capability of command-line operations by enabling practical and efficient processing of input data. It is frequently utilized in scripts and command pipelines, making it a staple in system administration and various automation tasks.
Use case 1: Run a command using the input data as arguments
Code:
arguments_source | xargs command
Motivation:
This use case showcases how xargs
can be employed to take output from a command or file and use it as arguments for another command. It is beneficial when you have a list of arguments generated on the fly and want to pass them to another command without manually inputting each one. For example, if you have a list of file names, and you want to delete or process them with a single command, xargs
makes it possible to automate this efficiently.
Explanation:
arguments_source
: This is the source of your input, which could be a command likels
or a file containing a list.|
: The pipe operator sends the output ofarguments_source
as input toxargs
.xargs command
: Thexargs
utility reads the input and assembles it into argument(s) for the specifiedcommand
.
Example Output:
Using ls
as arguments_source
:
ls | xargs echo
Output might be:
file1 file2 file3 directory1 directory2
Use case 2: Run multiple chained commands on the input data
Code:
arguments_source | xargs sh -c "command1 && command2 | command3"
Motivation:
In some scenarios, you may want to perform multiple operations in sequence on the input data. This use case demonstrates the flexibility of xargs
in executing compounded command sequences. For instance, if you need to check the contents of files and then filter or process the results further, xargs
can streamline this workflow.
Explanation:
arguments_source
: The origin of your data, perhaps from a command likefind
or an output file.|
: Directs the output toxargs
.xargs
: Parses the input.sh -c
: Allows the execution of complex shell commands."command1 && command2 | command3"
: Represents chained commands wherecommand1
runs first, followed bycommand2
ifcommand1
succeeds, and then pipes the output tocommand3
.
Example Output:
Using a list of URLs as arguments_source
:
cat urls.txt | xargs sh -c "curl -I $1 && echo Success"
Output might be:
HTTP/1.1 200 OK
Success
HTTP/1.1 404 Not Found
Success
Use case 3: Gzip all files with .log
extension taking advantage of multiple threads
Code:
find . -name '*.log' -print0 | xargs -0 -P 4 -n 1 gzip
Motivation:
When handling numerous files, parallel processing can significantly reduce operation time. This example uses xargs
to gzip multiple .log
files concurrently, leveraging multi-threading capabilities to enhance performance, which is especially useful in a directory with a large number of files.
Explanation:
find . -name '*.log' -print0
: Locates files with a.log
extension and outputs their names, using null characters as separators to handle filenames with spaces.|
: Connects the output toxargs
.xargs -0
: Instructsxargs
to use null characters as delimiters.-P 4
: Specifies running up to 4 processes in parallel.-n 1
: Applies the command to one argument at a time, ensuring each file is processed individually bygzip
.gzip
: The command applied to compress each file.
Example Output:
Compressing log1.log...
Compressing log2.log...
Compressing log3.log...
Use case 4: Execute the command once per argument
Code:
arguments_source | xargs -n1 command
Motivation:
Sometimes you need a command to run separately for each piece of input rather than all together. This scenario is common when each input requires independent treatment or results. xargs
facilitates this by executing the command once per argument, ensuring precise control over operation on individual inputs.
Explanation:
arguments_source
: Origin of the input data.|
: Directs the input toxargs
.xargs -n1
: Forcesxargs
to apply the command to one argument per execution, effectively iterating the command over each input item.command
: The command that executes on each argument.
Example Output:
Using a list of files:
echo -e "input1\ninput2\ninput3" | xargs -n1 echo
Output might be:
input1
input2
input3
Use case 5: Execute the command once for each input line, replacing any occurrences of the placeholder with the input line
Code:
arguments_source | xargs -I _ command _ optional_extra_arguments
Motivation:
This use case is valuable when you need to customize command execution by using placeholders to positionally substitute input data into the command. This approach offers flexibility and precision when the command and additional arguments require specific placement of each input item.
Explanation:
arguments_source
: The initial data source, possibly output from a command or file.|
: Sends the output toxargs
.xargs -I _
: Uses_
as a placeholder to replace each input line.command _
: Specifies where the placeholder will be inserted in the command.optional_extra_arguments
: Additional arguments that may accompany the command.
Example Output:
Using URLs in a file:
cat urls.txt | xargs -I {} curl -O {}
Output might be:
Downloading http://example.com/file1...
Downloading http://example.com/file2...
Use case 6: Parallel runs of up to max-procs
processes at a time
Code:
arguments_source | xargs -P max-procs command
Motivation:
Optimizing performance by running processes in parallel is a key advantage of using xargs
. By specifying the maximum number of processes to run simultaneously, you can balance workload across system resources, maximizing efficiency and minimizing completion time for substantial operations.
Explanation:
arguments_source
: The origin of data input.|
: Passes the data toxargs
.xargs -P max-procs
: Initiates parallel execution with the specified maximum number of concurrent processes.command
: The command run on each argument.max-procs
: Defines how many processes can run concurrently (if set to 0, uses as many as the system allows).
Example Output:
With process-intensive tasks like checksum computation:
echo "file1 file2 file3" | xargs -P 3 md5sum
Output might be:
5d41402abc4b2a76b9719d911017c592 file1
098f6bcd4621d373cade4e832627b4f6 file2
d41d8cd98f00b204e9800998ecf8427e file3
Conclusion:
The xargs
command serves as a versatile and indispensable tool in the Unix command-line environment. Each use case illustrated above exemplifies its ability to enhance command execution by acting on dynamic input in flexible, efficient, and powerful ways. With xargs
, users can streamline their workflow, automate repetitive tasks, and optimize computational resources, all integral when handling complex script operations or sizeable data sets.