Greetings! Thank you for such a wonderful tool in rsync. I am trying to use rsync to back up one filesystem tree to another on the same disk. The catch is that the destination tree is mounted under the source tree. To prevent the backup from getting a copy of itself, I have tried to use the --exclude option, but to no avail. The general procedure for my script is to cd to the destinateion directory (in this case: /mnt/backup) and rsync the source directory (in this case: /) to the destination directory. Here's the command that gets run: /usr/bin/rsync -v --progress --delete --stats --exclude='/proc/' --exclude='/sys/' --exclude='/mnt/sysbackup/' -aS / . I want to exclude the /sys, /proc, and /mnt/sysbackup directories and *everything* underneath them from being backed up to the /mnt/sysbackup directory. The kicker is that if I run that command manually like so: ( cd /mnt/sysbackup; /usr/bin/rsync -v --progress --delete --stats --exclude='/proc/' --exclude='/sys/' --exclude='/mnt/sysbackup/' -aS / . ) it works fine. When the exact same rsync command is run from within the script (following the cd /mnt/sysbackup command), I get a /mnt/sysbackup/mnt/sysbackup directory with *everything* under the /mnt/sysbackup directory duplicated. I also get /mnt/sysbackup/sys and /mnt/sysbackup/proc directories complete with data in them. Cheers!
A possible explanation is if the single-quotes are being retained in the --exclude values instead of being removed by whatever shell you are using for scripting. So rsync tries to exclude '/proc/' instead of /proc/ In your case, the quotes aren't even needed since you don't have wildcards, shell metachars, or whitespace in those path values. Remove the single-quotes and see if that helps. If it does, then either your shell has a problem or they weren't really single-quotes to begin with.
That is an interesting suggestion and one I dismissed out of hand. However, it is possible and I will evaluate that possibility. Thank you. I have removed the single quotes from surrounding the exclude values and testing that. FYI, here is the shell that I am using: # bash --version GNU bash, version 2.05b.0(1)-release (i686-pc-linux-gnu) Copyright (C) 2002 Free Software Foundation, Inc.
Hrm. Well, that suggestion didn't appear to work. The command that was run now was: /usr/bin/rsync -v --progress --delete --stats --exclude=/proc/ --exclude=/sys/ --exclude=/mnt/sysbackup/ -aS / . It still synced the directories that it shouldn't. I am going to strace it and see if I can figure out what is going on...
Rsync doesn't care about being run from inside a script or not. Depending on how the script was run, there can be differences in environment variables, but nothing in the command you mentioned should be affected by that (AFAICS). You should be looking for something in the script that is not quite what you think it is -- some subtle difference between the command you ran manually and the actual command in the script (such as a different source dir, a misspelled exclude, etc.). If you can't find what's wrong, feel free to attach the script to this bug report.
This isn't rsync issue but a strange manner how bash escapes the <'>. ### Script 1 (won't work): EXLUDES="--exclude='/whatever/'" rsync -avuz "$EXLUDES" /source /destination ### Script 2 (won't either): RSYNC="rsync -avuz --exclude='/whatever/' /source /destination" $RSYNC ### Script 3 (works as expected): VAL="'/whatever/'" EXLUDES="--exclude=$VAL" rsync -avuz "$EXLUDES" /source /destination
> ### Script 3 (works as expected) If by "works as expected" you mean that it excludes a file whose name is a single apostrophe whose grandparent directory also has a name of a single apostrophe. (That's certainly what I expect it to do, and what it actually does too.) Maybe you meant to write this VAL assignment? VAL='/whatever/' Keep in mind that shell-special characters are not re-parsed when expanding variables (which would be very bad) unless you use eval. It may also help to note that writing --exclude='foo' is exactly the same as writing '--exclude=foo' (it's just that the former seems more natural to most people), so there's no need for all the extra quotes in what you're trying to do -- just quote the values when assigning them to a variable and they'll be fine.