exclude a pattern but only in the top level

Brian K. White brian at aljex.com
Wed May 15 10:39:22 MDT 2013

On 5/15/2013 8:35 AM, Paul Slootman wrote:
> On Wed 15 May 2013, Brian K. White wrote:
>>> rsync -avz /foo/ ${DEST}::root/foo/
>> This syntax does work in his case, and is easier to read, because it
>> ends up using the exact same specification "/foo/" and "/foo/" for
>> both source and dest, but the syntax I had was also correct. I no
>> longer remember why I always do the way I posted, but I've been
>> doing it that way for decades (if you count rcp before rsync).
> My reasoning is that if you're transferring a directory, make that
> obvious by specifying a trailing slash. But use whatever you're happy
> with, just don't complain if things get confusing (which it looked like
> was the problem).

>> The -f ". filename" syntax is correct it's right in the manual and
>> I've been using it for ages.
> Well, -f specifies a filter rule. You're using -f to specify a filter
> rule to tell rsync to merge in a file with additional filter rules,
> which is a bit of a roundabout way. Why not tell rsync directly to read
> a file with include/exclude rules by using --exclude-from

I did in the case when it was only one pattern, but that was just a 
simplified example.

The actual job involves too many include and exclude patterns to use 
--include & --exclude, or even --include-from and --exclude-from, 
because the patterns are generated on the fly by a script from values 
supplied on the script commandline or hardcoded at the top, and for each 
of those values several different include and exclude patterns are 
generated, and, the order they appear in the filter file matters, I need 
to write the filter file so that certain things get included before 
others, and all the includes & excludes aren't necessarily together in 
two contiguous blocks.

-f ". filename" is actually the simplest and neatest way to express the job.


More information about the rsync mailing list