Xargs is a useful command that acts as a bridge between two commands, reading output of one and executing the other with the items read. The command is most commonly used in scenarios when a user is searching for a pattern, removing and renaming files, and more.
In its basic form,
xargs reads information from the standard input (or STDIN) and executes a command one or more times with the items read.
As an illustration, the following
xargs command expects the user to enter a file or a directory name:
Once a name is entered, the xargs command passes that information to the
ls command.
Here is the output of the above shown
xargs command when I executed it from my home directory by entering “Documents” (which is a sub-directory in my Home folder) as an input:
![xargs-basic-example xargs-basic-example]()
Observe that in this case, the
xargs command executed the
ls command with the directory name as a command line argument to produce a list of files present in that directory.
While the
xargs command can be used in various command line operations, it comes in really handy when used with the
find command. In this article, we will discuss some useful examples to understand how
xargs and
find can be used together.
Operations involving multiple files
Suppose you want to copy the contents of “ref.txt” to all .txt files present in a directory. While the task may otherwise require you to execute multiple commands, the
xargs command, along with the
find command, makes it simple.
Just run the following command:
find ./-name"*.txt"|xargs-n1cp ../ref.txt |
To understand the command shown above, let’s divide it into two parts.
The first part is
find ./ -name "*.txt" , which searches for all the .txt files present in the current directory.
The second part
xargs -n1 cp ../ref.txt will grab the output of the first command (the resulting file names) and hand it over to the
cp (copy) command one by one. Note that the
-n option is crucial here, as it instructs
xargs to use one argument per execution.
When combined together, the full command will copy the content of “ref.txt” to all .txt files in the directory.
Operations involving large number of arguments
One of the major advantages of using
xargs is its ability to handle a large number of arguments. For example, while deleting a large number of files in one go, the
rm command would sometimes fail with an “
Argument list too long” error. That’s because it couldn’t simply handle such a long list of arguments. This is usually the case when you have too many files in the folder that you want to delete.
![rm-arg-list-too-long rm-arg-list-too-long]()
This can be easily fixed with
xargs. To delete all these files, use the following command:
find ./rm-test/-name"*"-print|xargsrm |
Operations involving pattern search
Software developers as well as system administrators do a lot of pattern searching while working on the command line. For example, a developer might want to take a quick look at the project files that modify a particular variable, or a system administrator might want to see the files that use a particular system configuration parameter. In these scenarios,
xargs, along with
find and
grep, makes things easy for you.
For example, to search for all .txt files that contain the “maketecheasier” string, run the following command:
$ find ./-name"*.txt"|xargsgrep"maketecheasier" |
Here is the output the command produced on my system:
![find-xargs-grep find-xargs-grep]()
Cut/copy operations
Xargs, along with the
find command, can also be used to copy or move a set of files from one directory to another. For example, to move all the text files that are more than 10 minutes old from the current directory to the previous directory, use the following command:
find . -name"*.txt"-mmin +10|xargs -n1 -I'{}'mv'{}' ../ |
The
-I command line option is used by the
xargs command to define a replace-string which gets replaced with names read from the output of the
find command. Here the replace-string is {}, but it could be anything. For example, you can use “file” as a replace-string.
find . -name"*.txt"-mmin10|xargs -n1 -I'file'mv'file' ./practice |
How to tell xargs when to quit
Suppose you want to list the details of all the .txt files present in the current directory. As already explained, it can be easily done using the following command:
find . -name"*.txt"|xargsls-l |
But there is one problem; the
xargs command will execute the
ls command even if the
find command fails to find any .txt file. Here is an example:
![find-xargs find-xargs]()
So you can see that there are no .
txt files in the directory, but that didn’t stop
xargs from executing the
ls command. To change this behaviour, use the
-r command line option:
find . -name"*.txt"|xargs-rls-l |
Conclusion
Although I’ve concentrated here on using
xargs with
find, it can also be used with many other commands. Go through the command’s main page to learn more about it, and leave a comment below if you have a doubt/query.