Xargs Command in Linux
Introduction
You can use the xargs
utility to create and execute commands using standard input. It's most commonly used in conjunction with other instructions via piping.
You can pass standard input as an argument to command-line programs like mkdir
and rm
using xargs
.
In this tutorial, we'll go through the basics of using the xargs
command. We will also address a few FAQs on Xargs Command in Linux.
How to Use Linux xargs
Command
xargs
reads arguments from standard input, separated by blank spaces or newlines, and executes the specified command with the arguments from the input. If no command is specified, /bin/echo
is used by default.
The xargs
command has the following syntax:
xargs [OPTIONS] [COMMAND [initial-arguments]]
The most basic example of utilizing xargs
would be to use a pipe to provide multiple strings separated by whitespace to xargs
and then run a command with those strings as arguments.
echo "file1 file2 file3" | xargs touch
In the preceding example, the standard input is piped to xargs
, and the touch command is executed for each argument, resulting in three files. It's the same as if you were going to run:
touch file1 file2 file3
How to View the Command and Prompt the User
Use the -t
(--verbose
) option to print the command on the terminal before running it:
echo "file1 file2 file3" | xargs -t touch
Output
touch file1 file2 file3
Use the -p
(--interactive
) option to get a prompt whether to run each command before executing it:
echo "file1 file2 file3" | xargs -p touch
To confirm and start the command, type y
or Y
:
Output
touch file1 file2 file3 ?...y
When running damaging commands, this option comes in handy.
How to Limit the Number of Arguments
The system's limit determines the number of parameters provided to the command by default.
The -n
(--max-args
) option sets the maximum number of arguments that can be submitted to a command. xargs
executes the provided command as many times as required until all arguments have been exhausted.
The number of parameters read from the standard input is limited to one in the following example.
echo "file1 file2 file3" | xargs -n 1 -t touch
The touch command is executed separately for each argument, as shown in the verbose output below:
touch file1
touch file2
touch file3
How to Run Multiple Commands
Use the -I
option with xargs
to run several commands. It works by adding a replace-str
option after the -I
option, and replacing all instances of the replace-str
with the input supplied to xargs
.
The following xargs
example will perform two commands: first, it will use touch to create files, and then it will use the ls command to list the files:
echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }'
Output
-rw-r--r-- 1 linuxize users 0 May 6 11:54 file1
-rw-r--r-- 1 linuxize users 0 May 6 11:54 file2
-rw-r--r-- 1 linuxize users 0 May 6 11:54 file3
Percent %
is a popular replacement for replace-str
. You can, however, use another placeholder, such as ARGS:
echo "file1 file2 file3" | xargs -t -I ARGS sh -c '{ touch ARGS; ls -l ARGS; }'
How to Specify a Delimiter
Set a custom delimiter using the -d
(--delimiter
) option, which can be a single character or an escape sequence starting with \
.
We'll use ;
as a delimiter in the following example:
echo "file1;file2;file3" | xargs -d \; -t touch
Output
touch file1 file2 file3
How to Read Items from File
Instead of using standard input, the xargs command can read items from a file. Use the -a
(--arg-file
) option followed by the file name to accomplish this.
The xargs
command will read the ips.txt
file and ping each IP address in the following example.
8.8.8.8
1.1.1.1
We're also running xargs
with the -L 1
option, which tells it to read one line at a time. If this option is not used, xargs
will use a single ping command to ping all IPs.
xargs -t -L 1 -a ips.txt ping -c 1
Output
ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=68.1 ms
...
ping -c 1 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=21.4 ms
Using xargs
with find
The most common use of xargs
is in conjunction with the find command. Find can be used to find certain files, and then xargs
can be used to perform operations on those files.
Always use the find -print0
option, which causes find
to print the whole file name followed by a null character, to avoid problems with file names that contain newlines or other special characters. With the -0
, (--null
) option, xargs
may appropriately understand this output.
Find will print the entire names of all files in the /var/www/.cache
directory, and xargs
will send the file paths to the rm
command in the following example:
find /var/www/.cache -type f -print0 | xargs -0 rm -f
Using xargs to Trim Whitespace Characters
The xargs
command can also be used to eliminate whitespace from both sides of a string. Simply feed the string to the xargs
command, and it will cut it for you:
echo " Long line " | xargs
Output
Long line
When comparing strings in shell scripts, this can be handy.
#!/bin/bash
VAR1=" Vegastack "
VAR2="Vegastack"
if [[ "$VAR1" == "$VAR2" ]]; then
echo "Strings are equal."
else
echo "Strings are not equal."
fi
## Using xargs to trim VAR1
if [[ $(echo "$VAR1" | xargs) == "$VAR2" ]]; then
echo "Strings are equal."
else
echo "Strings are not equal."
fi
Output
Strings are not equal.
Strings are equal.
FAQs to Xargs Command in Linux
How does the xargs
command handle input items?
The xargs
command takes each item from the input (usually whitespace-separated) and appends it to the command as arguments. It executes the command multiple times if necessary, splitting the input items into manageable batches.
Can you provide an example of using the xargs
command?
Certainly! An example of using xargs
would be: find . -name "*.txt" | xargs grep "hello"
. This command finds all text files in the current directory and its subdirectories, then passes them as input to grep
to search for the word "hello".
How does the xargs
command handle whitespace and special characters in input items?
By default, xargs
treats whitespace, single quotes, and double quotes as delimiters. It handles special characters and escapes them appropriately when passing them to the command for execution.
How can I limit the number of items processed at a time by xargs
?
You can limit the number of items processed at a time using the -n
option followed by a number. For example, xargs -n 5 command
executes command
on groups of up to 5 input items at a time.
Can the xargs
command execute commands in parallel?
Yes, the xargs
command can execute commands in parallel using the -P
option followed by a number. For example, xargs -P 4 command
runs command
in parallel with a maximum of 4 concurrent processes.
How can I specify a custom delimiter for input items with xargs
?
You can specify a custom delimiter using the -d
option followed by the desired delimiter character. For example, echo "item1;item2;item3" | xargs -d ';' command
executes command
on each item separated by semicolons.
Is there a dry-run mode for the xargs
command?
Yes, the xargs
command supports a dry-run mode using the -t
or --verbose
option. This mode shows the commands that would be executed without actually executing them.
Conclusion
On Linux, xargs
is a command-line utility that allows you to create and execute commands.
Read the xargs man
page for more information about each xargs option.
If you have any queries, please leave a comment below and we’ll be happy to respond to them.