Easy-to-follow video tutorials help you learn software, creative, and business skills.Become a member
Now that we have seen how xargs works, I want you to help you to see the power that it gives by demonstrating some of its uses. There's no limits what you can do with xargs, but these example should give you an idea of how other people typically use it and get you thinking about ways to make it work for you. The first example I want to show you is how to use xargs with what I call File Manifest. Notice that I am inside my user directory and inside UNIX files and in there, there is a file called file_manifest.txt. It's just simply a list of file names of files that are in the same current directory. The idea here is that I have selected the files that I care about and have arranged them in a certain order.
Now I can use xargs to do something with those. Now what you do with them is up to you. You can open them, you might grep them, you might print them, or you might just want to concatenate their contents together. They might represent file templates that we want to copy over whenever we start a new project. For now, I'm just going to use cat just to show you the contents of them and then pipe it through less, so that we just don't get a huge stream of output. So there you go, you can see that that's exactly what it did. It took each of these files and put them together in the order I specified. Imagine that you had 20 different files that all belonged to one project and you wanted to assemble those together in a certain order for presentation or something.
You could use this file manifest technique to be able to manage them. It's not just file names that we put in a file that we can use. We could for example use our fruit file, fruit.txt. That's just going to be a simple list of fruit. Let's take that and let's pipe it through sort and unique. So we have the unique list of fruit. And then we will send that to xargs. And in xargs, we will use our placeholder specifier, make a directory, including the parent directories, and we will put it on our desktop, a folder called fruits and in that we will put a folder for each of these fruits.
There it is, we have fruits now that appeared on our desktop. I am going to open that folder up. I have got a folder for each one of my fruits. Imagine that we have got a class of 30 students and we need to create a folder to put each student's work in for all 30 students. We take the list of their first names and last names, pass it to xargs and boom, we have created 30 folders with just one single command. You can see how it can really speed up repetitive tasks that we normally would do in the Finder. Let me give you another example. Let's say that we have our process list and we want to pipe that through grep and we are going to look for some process, some set of processes that have gone bad somehow, we need to get rid of. There are bad processes we'll call them and if I just hit Return on that, you will see that it comes up and if finds the grep that I am doing for. bad process.
That's the only process that matches. So this is just a demo, and what we will do is we will pass that in to cut and we will grab, 11-15, which will represent this process ID here, and then we will take all of those process IDs that it finds, pass them in to xargs with kill -9. Boom, we just killed all of our bad processes. Now it came up and told me there were no such processes and that's because this process that if did find, grep bad processes, is gone by the time it gets over here to kill it. It started and it stopped before kill could ever get a hold of it.
But you see the concept and it shows you how you can use xargs in some unusual places. In general xargs works really well with grep. So for example, we had grep for apple inside all the files called fruit.txt and it gives us back all of those matches. Remember we used the -l option in front of it, dash lowercase L. Now it gives us just the file names themselves. So now these files are ready to be passed into xargs. We have found everything that had a match. Now we can do whatever we want with those files that have a match. We can take them and we can pipe them into xarg's word count.
We can find out the word counts of those. Or we can concatenate them altogether. It also works really well with find. So for example, we could find everything that's in my test directory and everything that's typed as a standard file, and pass that to xargs and change the permissions on that to be 755. Now remember, I told you that sometimes we need to use this -0 as an option to xargs. Well, dind is one of the places where we really want to use it and find even has a special option of its own called print0.
So print0 will make sure that the null character is used to separate them and then the -0 on xargs will make sure the xargs uses that null character. So it's a way for the two of them to communicate effectively. We can go ahead and hit Return on that. Let's try another example. Let's do find and we will look everything in the current directory whose name matches fruit. We will do that one again and we are going to use print zero, pipe it through xargs with -0, and then let's use our placeholder specifier and what we are going to do is copy each one of those arguments to Desktop and we are going to use that placeholder again, but also append.backup to the end.
So I hit Return and guess what? It went and found each one of those files that had a match, send it to xargs, and then copied it as a backup file to my desktop. Now, let's say that we want to remove all of those backup files. So we have Find and Desktop. Everything on the Desktop whose name has backup at the end and we will do the print0. Pipe it through xargs with -0 and then we can use rm. Now you might think well, let's use rm-i for interactive.
Actually xargs doesn't allow you to do interactive. If you want xargs to be interactive, you have to use the -p option for prompt. And this will work for any kind of Xarg's thing and basically it will prompt you before it actually does it. It gives you a chance to say yes or no. There is one other thing that I want to caution you about here, which is that when we are doing a find, especially if you are doing a find that is going to then do copy or remove or anything like that, it's a good idea to make sure that you are not searching too deeply in the folders. If I really just want to get rid of these things that are on my Desktop, then I need to specify the depth is going to be equal to one.
Just look in the current immediate folder, don't go any deeper, or if I want it to allow to go two folders deep, then you could specify depth 2. You want to make sure that you don't accidentally grep more files than you intend to. All right, let's hit Return on this. You will see xargs give you a prompt saying hey, do you want to remove all these files? First I'll start with saying n and then Return, so that's no. I am just going to make a change to it now. I am going to say -n1 as an option. So it will take each one of these as a separate argument. Now, it comes up and says, ah, do you want to remove this one? Y, boom, it's gone.
Y. We get a chance to approve each one of them before they disappear. The -n option makes sure that they are sent in, each one as its own argument. And I have shown you that xargs works well with grep and it works well with find and it works really well if we use both. Let me just paste in a fake example here. Imagine that I am finding everything in the current directory whose filename has invoice anywhere in it. Pass that to xargs and then tell grep, hey, look inside that subset of files and see if you find the word programming and tell me what those files names are. Of course, it is fake example. I don't have any files called invoice.
Imagine that we are a web developer and we are looking for all files in our website that have .html at the end, pass those off, and grep those to find a certain tag that we are looking for, like h3. Now again, this is just a demo example, but you get the idea. Now not only would I be able to use find and then pass it to xargs and grep it but what I am getting back is a list of file names because I used that -l option. So guess what? I can use xargs again on the file names that it returns from that. Let me show you a real example. Here is one where we say all right, find everything whose file has fruit.txt, grep it for mango inside the file and then pass that to xargs a second time, and this time we are going to copy it to our desktop. So there we go.
Boom, it searched for the file name, looked for the right file content, and then copied the file to our desktop. These examples are just a small sample of what you can do with xargs. I want you to think of using xargs, whenever you want to perform a command on many items in the list. That list can be recorded in a file, as we saw with the file manifest, or it can be dynamically generated by another command, as we did with grep and find. And if you learn to use xargs effectively, it will really speed up your workflow.
Get unlimited access to all courses for just $25/month.Become a member
Access exercise files from a button right under the course name.
Search within course videos and transcripts, and jump right to the results.
Remove icons showing you already watched videos if you want to start over.
Make the video wide, narrow, full-screen, or pop the player out of the page into its own window.
Click on text in the transcript to jump to that spot in the video. As the video plays, the relevant spot in the transcript will be highlighted.