22

So, I have a seemingly simple issue, but so far I haven't found a solution: I want to exclude the topmost directory from an rsync, while still syncing all its children. The particular issue is that I don't have permission to modify the times of the topmost directory, but want all the children to have properly sync'd times.

The rsync command I'm using is as follows:

rsync --exclude ./ -rlptDu ./ server.example.com:/usr/local/directory/

and server.example.com:/usr/local/directory/ looks like this:

drwxrws---  5 root   staff 24576 Jul  9 15:00 .

(my local user is a member of staff)

When I run rsync, I get the following error:

rsync: failed to set times on "/usr/local/directory/.": Operation not permitted (1)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.9]
make: *** [pub_to_mel_internal] Error 23

This is version 3.0.9 on the local machine and 3.0.7 on the remote, both machines running Debian.

2
  • Are you familiar with the syntax in this example: wirespeed.xs4all.nl/mediawiki/index.php/… It allows you to include specific files/directories from an otherwise excluded directory. You might need to use an exclude file though.
    – jippie
    Commented Jul 9, 2012 at 19:35
  • Yeah. The issue is that I can't seem to convince it to exclude the toplevel directory (specifically). I haven't had issues with mixing includes / excludes in the past, it just seems as though the toplevel is a special case. Commented Jul 9, 2012 at 20:46

2 Answers 2

13

I think rsync's filter rules can't match the toplevel directory, so it's always synchronized. A workaround is to synchronize all the files inside this directory instead of the directory itself.

rsync -rlptDu -- * server.example.com:/usr/local/directory/

Add .[!.]* after * if you have dot files in the topmost directory, and ..?* if you have file names beginning with two dots.

3
  • 2
    Awesome, thanks! That works. The only downside of this technique is that it requires the shell to select all the files. If you have tons of files in the directory (which I don't in my case), it may choke. That could probably be fixed using xargs (although not with the --delete options). Commented Jul 9, 2012 at 22:53
  • 2
    One problem I got with using * was that --delete did not delete any files, since they were not part of the search.
    – thomasa88
    Commented Feb 10, 2016 at 14:33
  • @thomasa88 Please see this answer. Commented Jul 26, 2019 at 12:56
1

It seems rsync can exclude the topmost directory using --files-from:

$ rsync -anv from/ to/
sending incremental file list
./
a
b.test

sent 97 bytes  received 25 bytes  244.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
$ printf '%s\n' 'a' 'b.test' | rsync -anv --files-from=- from/ to/
building file list ... done
a
b.test

sent 88 bytes  received 22 bytes  220.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Just stumbled upon it, leaving a clue here in case it helps someone (or me in the future).

You must log in to answer this question.

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