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:
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 -n1 cp ../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.
This can be easily fixed with
xargs
. To delete all these files, use the following command:
find ./rm-test/ -name "*" -print | xargs rm
|
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" | xargs grep "maketecheasier"
|
Here is the output the command produced on my system:
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" -mmin 10 | 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" | xargs ls -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:
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 -r ls -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.
No comments:
Post a Comment