rsync command is a powerful file copying and folder synchronization tool. Here are ten common use-cases that you’ll be able to put to good use on your own systems.
The rsync Tool
rsync tool copies files and directories between two computers. It uses a sophisticated algorithm that scans directory trees to find files on the source computer that don’t exist on the destination computer. These files are transmitted to the destination computer. What makes
rync so clever is it can figure out which pieces of existing files have been modified, and it only sends the changed portions.
You can use
rsync to copy files to a different location on your hard drive, to a different hard drive in the same computer, to an externally connected USB drive, or any other network-accessible location.
On top of that,
rsync can optionally preserve symbolic links, hard links, and file metadata such as file ownership, permissions, and access times. To support all this functionality,
rsync has many options and figuring them all out takes time. We’ve collected these 10 examples to help you get started. We’ve already written about doing backups with
rsync , so we’re concentrating on other uses here.
For all of its many options, the structure of an
rsync command is simple. We need to provide the source, the destination, and the options we want to use. You’ll probably find that
rsync is already installed on your Linux computer—it was, on all of our test machines—but if it isn’t it’ll definitely be in your distribution’s repositories.
1. Copy Files to a Different Directory
Here’s a simple example to get us going. We’re going to copy the files from the “project-files” directory to the “Documents” directory. We’re using two options, the
-a (archive) option and the
-v (verbose) option. The verbose option tells
rsync to explain what its doing as it does it. The
archive option preserves file ownership and some other items we’ll look at shortly.
The format of the command is
options source-location destination-location.
rsync -av /home/dave/project-files/ /home/dave/Documents/
ls on “Documents” folder shows the files have been copied.
rsync is working, the files are listed as they’re copied. We’re told:
- The number of bytes that are sent.
- The number of bytes received. Before the file transfer takes place,
rsynchas to work out which files need to be transferred. To do that, some information about the files on the destination must be retrieved by
rsync. This information is contained in the received bytes.
- The speed of the transfer.
- The total size of the copied files.
- The “speedup.” This is the ratio of the total size divided by the sum of the sent and received bytes. The higher this number, the more efficient the transfer.
We modified the text file in the source directory and repeated the
rsync -av /home/dave/project-files/ /home/dave/Documents/
This time the only file that needs to be updated is the text file we modified. The speedup figure is now 30,850. This is how much more efficient it is to copy the modified portion of that single file, than to copy all of the files.
-a (archive) option actually represents a collection of other options. It’s the same as using all of these options:
- r: Recursively work through directory trees in the source directory and copy them to the destination directory, creating them if they do not already exist there.
- l: Copy symlinks as symlinks.
- p: Preserve file permissions.
- t: Preserve file modification times.
- g: Preserve group permissions.
- o: Preserve the file ownership.
- D: Copy special files and device files. Special files can be communication-centric items that are treated like files, such as sockets and first-in, first-out pipes (fifos). Device files are special files that provide access to devices and pseudo-devices.
This is such a frequently used combination that
rsync provides the
-a (archive) option as a shorthand way to invoke them all.
2. Copy a Directory to a Different Directory
If you look at the previous
rsync command you’ll see a trailing forward slash “/” on the file path of the source directory. This is significant. It tells
rsync to copy the contents of the directory. If you don’t provide the trailing forward slash,
rsync will copy the directory and its contents.
rsync -av /home/dave/project-files /home/dave/Documents/
This time the directory name is added to the file name as they are listed. If we look inside the destination directory we’ll see the source folder has been copied across with the files inside it.
3. Copy a Directory to a Different Drive
Copying files to another location on the same hard drive doesn’t give you protection against a drive failure. If that drive gives up the ghost, you’ve lost the source and destination copies of those files. Copying them to another hard drive is a much more robust way to protect your data. All we need to do is provide the correct path to the destination drive.
rsync -av /home/dave/project-files /run/mount/drive2
Looking at the other hard drive shows us the directory and files were copied over to it.
4. Doing a Dry Run First
Before we look at how
rsync can usefully delete files for us, let’s look at how we can make
rsync perform a dry run.
In a dry run,
rsync goes through the motions of performing the actions we’ve asked for, but doesn’t actually do them. It reports on what would have happened if the command had been executed. This way, we can make sure that the command does exactly what we expect.
To force a dry run we use the
rsync -av --dry-run /home/dave/geocoder /run/mount/drive2
The files that would have been copied are listed for us, and we get the usual statistics, followed by the message
(DRY RUN) so that we know nothing actually took place.
5. Deleting Files in the Destination Directory
--delete option tells
rsync to delete files and directories in the destination directory that are not in the source directory. This means the destination directory will be an exact copy of the source directory. We’ll be prudent and use the
--dry-run option first.
rsync -av --delete --dry-run /home/dave/geocoder /run/mount/drive2
We’re informed that two files will be deleted. If we’re sure we don’t care that they’ll be deleted, we can remove the
--dry-run option and carry out the command for real.
rsync -av --delete /home/dave/geocoder /run/mount/drive2
This time the contents of the directories are synchronized and the two extra files are deleted.
6. Deleting The Source Files
You can choose to delete the source files after a successful transfer, making
rsync operate more like a move than a copy. If the transfer wasn’t successful, the source files are not deleted. The option we need to use is
rsync -av --remove-source-files /home/dave/geocoder /run/mount/drive2
Note that the files can be deleted even if no files are transferred. That’s because if
rsync checks, and all the files are already in the destination directory and there’s nothing for
rsync to do,
rsync considers that a successful transfer.
rsync only deletes the files from the source directory. It doesn’t delete the source directory nor any sub-directories, just the files in them. We can see this by using the
-R (recursive) option with
ls, on the source directory.
ls -R geocoder
7. Copy Files to a Remote Computer
To synchronize folders with a remote computer,
rsync must be installed on both computers. Set up SSH communication between the two computers before you try to use
rsync to the remote computer.
You need to be able to log in remotely as a regular user on the remote computer for
rsync to work. It doesn’t matter whether you use an ID and password to log in, or if you’ve set up SSH keys for secure password-less access, but if you can’t log in as a user, then
rsync won’t work either.
If you log in with a password,
rsync will prompt you for the password. If you use SSH keys to log, in the process is seamless.
The only extra thing you need to do is to add the user account name and the IP address of the remote computer to the start of the destination file path. Use an at sign “
@” to separate the user name from the computer name or IP address, and a colon “
:” to separate the computer name or IP address from the directory path.
On our test network, these two commands are equivalent.
rsync -av /home/dave/geocoder firstname.lastname@example.org:/home/dave/Downloads
rsync -av /home/dave/geocoder email@example.com:/home/dave/Downloads
We get the same information reported to us as we do when we’re copying files locally.
8. Include or Exclude Files or Directories
You may have files and directories in the source directory that you don’t want to copy to the destination computer. You can exclude them using the
--exclude option. In a similar way, you can choose to include specific files and directories with the
The quirk is that if you use the
--include option on its own, all files are copied, as normal—including your specifically included files. To only copy your included files you have to
--exclude everything else.
You can use as many
--exclude options in your command as you like, but make sure you put your
--include options before your
--exclude options. Also, make sure you have a trailing forward slash on your source file path.
This command copies only C source code files and CSV data files to the destination computer.
rsync -av --include="*.c" --include="*.csv" --exclude="*" /home/dave/geocoder/ /run/mount/drive2/geocoder
The only files copied are the ones we specifically included.
9. Compress Files in Transfer
-z (compress) option causes
rsync to compress the transferred files. They’re not stored as compressed files on the destination computer though, they’re only compressed during the transfer itself. This can speed up lengthy transfers.
rsync -avz /home/dave/geocoder /run/mount/drive2
10. Monitoring Progress
Speaking of lengthy transfers, we can add some statistics so that we can see the progress of the transfer.
-P (partial, progress) option actually adds two options,
--progress . The
--partial option tells
rsync to keep partially transferred files if a transfer fails. This saves time when the transfer is restarted.
--progress option prints, for each file, the data transferred in bytes and as a percentage, the speed of the transfer, the time taken, the number of the file being transferred, and the count of the remaining files.
rsync -aP /home/dave/geocoder /run/mount/drive2
The output scrolls past pretty quickly, and it is difficult to read. You can improve things slightly by removing the
-v (verbose) option from the command. Even then it is still difficult to read as it whizzes by.
It is often more useful to monitor the progress of the overall transfer. You can do this with the –info option, and passing it “progress2” as a parameter.
sync -a --info=progress2 /home/dave/geocoder /run/mount/drive2
This gives a progress report that is actually useful.
Like cp on Steroids
rsync command is fast, flexible, and well worth the time it takes to familiarize yourself with it. The basic form of an
rsync command with the
-av options, source directory, and destination directory isn’t hard to remember at all.
For many use-cases, that’s all you need. Get comfortable with that and the rest will come easily.