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.