374

I recently set up a machine with Ubuntu Server to host game servers. I installed a backup plugin for each game server that creates frequent backups of game world files in a particular folder on the machine. I also established a cron task to automatically copy those backups to my Dropbox folder every night using rsync with the -a option.

After a few months my Dropbox account reached its storage limit and I realized I would not be able to keep so many backups, so I configured the game server backup plugin to not retain so many backups, then waited a few days to see if it would delete the older backups as it is scheduled to do on a weekly basis. The backup plugin eventually did its job and deleted the older backups, so I was expecting the rsync cron task to subsequently delete the older backups from my Dropbox folder to match the source folder, but it has not done so. So I have a couple of questions:

  • By default, does rsync only add files to the destination folder that have been added to the source folder and change files that have been changed in the source folder but NOT delete files that were deleted from the source folder?

  • If that is the case, what is the best way to make rsync do this? I want the destination folder to perfectly reflect the source folder, and that means deleting any files that have been deleted from the source folder.

I see some options listed in the manual page for rsync that might do the trick, but since I'm not familiar with.

1

6 Answers 6

466

To delete files in the target, add the --delete option to your command. For example:

rsync -avh source/ dest/ --delete

NB: -avh is for --archive --verbose --human-readable

11
  • 54
    Make sure the source is a directory. Using source/* dest/ won't work. Commented Sep 27, 2016 at 1:13
  • 8
    I found that event with --delete or --delete-after it won't delete because of some errors: "IO error encountered -- skipping file deletion". To resolve this add --ignore-errors option and debug the errors separately
    – MHT
    Commented Dec 18, 2016 at 13:25
  • 36
    Works perfectly! Even though it is working, I would recommend to ALWAYS use -n, --dry-run option, before running rsync, specially when it comes to options like these (--delete). It will avoid any possible headache :).
    – ivanleoncz
    Commented May 31, 2017 at 16:36
  • 3
    @TheBicentennialMan -a implies -r.
    – x-yuri
    Commented Mar 27, 2019 at 20:51
  • 2
    @oemb1905 bud, your sentiment is good but this is the land of man deep digging your flags -avWeqr are not right: - uses both vq, this is verbose being cancelled by quiet and not sane. - a is shorthand for -rlptgoD ... therefore your second use of r is redundant. - e is used twice also summary: your use -avWeqr == -aW to my reading.
    – Williams
    Commented Nov 16, 2019 at 0:12
69

The rsync command wont delete any file while you use some of its options delete in that command. So if any file or folder added in source, it'll be synced to target without any deletion.

I suggest you to use rsync for make backup from source files and use find ... rm for deletion files for period of time or size of files:

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

The above code block, make a backup from source and then delete every files which last modified time are more than 2 month.

UPDATE

As I find that the delete options are just for TARGET that if some files are removed from source, rsync --delete remove them from TARGET. And the delete option by after and before, as mentioned in its man page:

--delete-before         receiver deletes before transfer, not during

Means that:

  1. rsync delete the file from TARGET which are removed from SOURCE.
  2. rsync start syncing files.
--delete-after          receiver deletes after transfer, not during

Means that:

  1. rsync start syncing files.
  2. rsync delete the file from TARGET which are removed from SOURCE after syncing.

NOTE: The --delete-{before/after} implement just in TARGET.

9
  • 1
    Thanks for the reply!! Are you referring to a "delete" option for rsync? Why can't I just use the "delete" option for rsync?
    – user254251
    Commented Jun 3, 2014 at 6:03
  • @user254251, If you use delete, the rsync command immediately delete files. But in this case there is more time for any errors.
    – shgnInc
    Commented Jun 3, 2014 at 6:44
  • If I understand correctly, you're saying I should separate the deletion task from the rsync task to avoid errors. I have a question, though. The manual page for rsync lists some options that appear to serve the purpose of separating the deletion task by running it before or after the copying task. For example, I see two options called --delete-before and --delete-after. Would rsync with these options have the same effect as the method you described? I read the full description of each option on the manual page but there is some information in the descriptions that I don't understand.
    – user254251
    Commented Jun 3, 2014 at 8:02
  • @user254251, Answer was updated. I don't know if there is a way to delete files from TARGET by time limitation in rsync.
    – shgnInc
    Commented Jun 3, 2014 at 9:48
  • Thanks! So do you think I am safe from errors if I simply use the --delete-before option? I am not specifying a timeout so I shouldn't have to worry if the rsync deletion stage delays the transfer stage. rsync runs once per day and that is plenty of time to sync the backup files before the next sync, so I shouldn't need to time-limit the sync either.
    – user254251
    Commented Jun 4, 2014 at 5:13
16

The command

$ rsync -avhn --delete local/ remote/

takes care to always sync back changes done locally to the remote. That means it takes care to synchronize local and remote such that

  1. files added in local are added to remote
  2. files removed from local are removed from remote
  3. files added in remote are removed
  4. files removed from remote are restored from local if they exist, else ignored

The parameters explained:

  • -a archive mode
  • -v increase verbosity
  • -h output numbers in a human-readable format
  • -n dry run, perform a trial run with no changes made. Always use this flag initially to prevent data loss. When you are happy, remove it.

Let the results speak for themselves:

  • Create 2 directories

    $ mkdir local/ remote/
    
  • Create files in them

    $ touch local/local_only remote/remote_only local/exists_locally_and_remotely remote/exists_locally_and_remotely`
    
  • See what has been created (before rsync):

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  remote_only
    
  • calling rsync:

    $ rsync -avh --delete local/ remote/
    sending incremental file list
    deleting remote_only
    local_only
    
    sent 160 bytes  received 50 bytes  420.00 bytes/sec
    total size is 0  speedup is 0.00
    
  • See the result (after rsync):

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  local_only
    

As you can see, the file remote/remote_only has been deleted, the file local/local_only has been synchronized.

1
  • That works for me too unless the destination is truly remote. In that case, local_only is sent, but remote_only is not deleted. In my test, I tar the remote directory on the local host, scp it to otherhost, un-tar it there, and try to sync them with, e.g., rsync -avh --delete local/ otherhost:$(pwd)/remote/.
    – Jim
    Commented Jan 9, 2023 at 23:26
8

This command will copy increment data and keep it in sync with remote server.

  1. It will copy only incremental data.
  2. It will delete if any data deleted from source.
  3. It will copy again from source if any data deleted at destination.
  4. basically this command will keep the both environment in sync.

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

Example:

rsync -avWe ssh --delete-before /data [email protected]:/backup
rsync -avW --delete-before -e ssh /data [email protected]:/backup
2
  • 2
    I think -W makes it not to copy only incremental data but to always copy whole files. Commented Nov 25, 2015 at 19:27
  • I got this error by executing this command: rsync: Failed to exec --delete-before: No such file or directory (2)
    – Jeff Tian
    Commented Dec 10, 2015 at 2:34
5

If there are any errors during an rsync scync, rsync will not properly delete the files it should have, even if you used --delete, --delete-after, or --delete-before.

This is why it is important to address rsync errors.

Most of my errors were due to using the --perms option while syncing with a Non-Linux file system. When I replaced --perms with --no-perms, those errors went away and then deleting worked.

--perms is ok when you are syncing from a Linux file system to a another Linux file system, but if you're syncing from Linux to a Non-Linux file system (like NTFS, FAT), --perms causes errors because rsync cannot set Linux permissions on a non-linux file systems. Again, errors = no delete.

-- When syncing to a Non-Linux partition, I use --no-perms to avoid those errors that sabotage --delete, --delete-after, or --delete-before.

If you still get errors after that, and cannot figure out how to make those errors go way, you can run a command that is exclusively dedicated to deleting the out-of-sync files:

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

The command above will delete stuff that's out of sync, but won't sync any files. So, you should sync again after this. That command is based off of this answer, except that I added the --ignore-errors argument also, so it would delete even if there are errors.

2
  • 2
    Thanks for the tip! I am the original author of this question 5 years ago. I'm really glad you posted this, cuz I have been planning to set up syncing to an NTFS drive in the near future, and I probably would have run into the permissions error because I was planning to use the "-a" option for rsync, which syncs permissions (among other things). So I added "--no-perms" to my notes. I now plan to use rsync -a --no-perms --delete-before . I have a question: Wouldn't --delete-before avoid problems with file deletion by running the deletion before the sync? Thought that was its purpose.
    – user254251
    Commented Aug 6, 2019 at 1:35
  • @user254251 - I'm not certain. I guess it would depend on how early it really "deletes before". If it some how encounters one error before the deleting begins, your screwed. My advice to you is to avoid NTFS anytime you can unless you like sharp pains in your ass :). NTFS to NTFS works fine. NTFS to Linix works fine. Avoid "Linux file system" to "Non-Linux File System"; it is too much of a pain to ensure deleting works right. You CAN accomplish this, but I decided it isn't worth the trouble versus just formatting the destination drive as EXT4. Commented Aug 7, 2019 at 16:06
0

The ‘-delete’ flag has to appear after your /source and /destination.
So it’s like this

rsync -rvpthE --progress /Volumes/EOS_DIGITAL/DCIM/ /Users/mitchellg/Desktop/files -delete

The options are:

  • -r recursive
  • -v verbose (print to screen)
  • -p permissions
  • -t time (use time instead of checksums ‘c’)
  • -h human readable
  • -E extended Info (the Color tags on a .Mac)
1
  • 4
    Are you sure that you don't need two -- in front of --delete? And why do you think the position of this delete option has to appear after the directories?
    – PeterCo
    Commented Jan 13, 2021 at 14:12

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .