trying to understand --include and --exclude

Aaron Morris aaronwmorris at gmail.com
Sun Nov 27 22:13:30 GMT 2005


On 11/27/05, Phil Howard <phil-rsync-2 at ipal.net> wrote:
> I was under the impression that --include and --exclude worked by matching
> patterns in the order given, and whichever matched first, whether that was
> an include or exclude determined the action for that file.  I have a big
> directory from which I am attempting to transfer selected files.  I want
> all files where the first level directory is anything, the second level
> directory is "2005" and the third level is the file "07.tar.bz2".  So I
> started with these options (different tries on each line):
>
>     --include '**/2005/07.tar.bz2' --exclude '**'
>     --include '**/2005/07.tar.bz2' --exclude '*'
>     --include '*/2005/07.tar.bz2' --exclude '**'
>     --include '*/2005/07.tar.bz2' --exclude '*'
>
> I also tried numerous other random variations.  Either I get absolutely no
> files at all matching, or I get everything in the entire directory tree to
> match.
>
> I hope what I want is clear to you.  How can I make it clear to rsync?
>
> I've had several other cases of this in the past, and stumbled on something
> that worked without really understanding why.  So I guess the explanations
> in the man page just didn't really give me the correct understanding of how
> this works.  Maybe someone can try explaining in another way.
>
> --
> -----------------------------------------------------------------------------
> | Phil Howard KA9WGN       | http://linuxhomepage.com/      http://ham.org/ |
> | (first name) at ipal.net | http://phil.ipal.org/   http://ka9wgn.ham.org/ |
> -----------------------------------------------------------------------------


I think you are trying to include too many things in a single
include/exclude statement.  You need to break everything down to
files, folders, and sets of files in a single folder.  For example, if
you want to transfer a file 3 directories deep, each parent directory
needs to be included if there is a global exclude at the end of your
statements.

The following will probably give you what you want:

--include "/*"  (include all files at root of transfer)
--include "/*/2005/" --include "/*/2005/07.tar.bz2" (include file
07.tar.bz2, you must also include the folder that contains the file
because of the next statement)
--exclude "*"  (exclude everything not explicitly included)

I haven't tested it, so YMMV.

--
Aaron W Morris (decep) <aaronwmorris at gmail.com>


More information about the rsync mailing list