Copying a file with the Linux command line is easy. However, what if you want to copy the same file to several different locations? That’s easy, too, and we’ll show you how to do that with one command.

Normally, to copy one file, you would use the cp command, linking to the source file and the destination directory:

cp ~/Documents/FileToBeCopied.txt ~/TextFiles/

To copy it to two more directories, many people would just run the command two more times, with different destinations:

cp ~/Documents/FileToBeCopied.txt ~/Dropbox/
cp ~/Documents/FileToBeCopied.txt /media/lori/MYUSBDRIVE/

However, we can do the same task with one command:

echo dir1 dir2 dir3 | xargs -n 1 cp file1

Here’s how this command works. The echo command normally writes to the screen. However, in this case, we want to feed the output of the echo command as input to the xargs command. To do this, we use the pipe symbol ( | ) which feeds output from one command as input to another. The xargs command will run the cp command three times, each time appending the next directory path piped to it from the echo command on to the end of the cp command. There are three arguments being passed to xargs , but the -n 1 option on the xargs command tells it to only append one of those arguments at a time to the cp command each time it’s run.

So, to stick with our example from earlier, the three separate cp commands above can be combined into one command like this:

echo ~/TextFiles/ ~/Dropbox /media/lori/MYUSBDRIVE | xargs -n 1 cp ~/Documents/FileToBeCopied.txt

Note that if the file being copied exists in any of the destination directories specified, the file in that destination will be replaced automatically. You will not be asked if you want to replace the file. (Normally, when you use the cp command to copy a file to a single location, you can add the -i option to ask if you want to replace an existing file. However, the -i option is an interactive option (it causes the cp command to ask for input from the user) and you cannot use an interactive option with the cp command when using it in conjunction with xargs .)

One other thing to consider, is that if you are copying a very large file, you might want to add the no-clobber ( -n ) option to the cp command in the single command above. This option automatically prevents a file from being overwritten in a destination if it already exists there. If you’re copying a very large file over a network, it may be slow and you might want to avoid using the resources required to copy and replace the file. The following command adds the -n option, and will not copy the file to any destination listed in the arguments to the echo statement, if the file already exists in that destination.

echo ~/TextFiles/ ~/Dropbox /media/lori/MYUSBDRIVE | xargs -n 1 cp -n ~/Documents/FileToBeCopied.txt

Type man echo, man xargs, or man cp on the command line in Linux for more information about any of these commands.

Profile Photo for Lori Kaufman Lori Kaufman
Lori Kaufman is a technology expert with 25 years of experience. She's been a senior technical writer, worked as a programmer, and has even run her own multi-location business.
Read Full Bio »