Search code examples
linuxbashunixrsync

rsync include-from file recursion


I want to get only new or changed file list with few filters on result. My all new or changed files are:

>f+++++++++ dsadcache.txt
>f+++++++++ root.svn
>f+++++++++ txt-file-in-root.txt
>fcsT...... wp-config.php
cd+++++++++ cache/
>f+++++++++ cache/fileincac.txt
>f+++++++++ cache/fileincache.txt
>f+++++++++ wp-content/inside.svn
>f+++++++++ wp-content/inside.txt
>f+++++++++ wp-content/object-cache.php

Final result should looks like:

>f+++++++++ txt-file-in-root.txt
>fcsT...... wp-config.php   
>f+++++++++ wp-content/inside.txt

When i try to include-from file with this rules:

- *cache*
+ *.html
+ *.txt
+ *.js
+ *.php
+ *.jpg
+ *.jpeg
+ *.png
+ *.bmp
+ *.gif
+ *.tif
+ *.tiff
+ *.ico
+ *.json
+ *.xml
- *

filters work but the result is not recursive

>f+++++++++ txt-file-in-root.txt
>fcsT...... wp-config.php

missing:

>f+++++++++ wp-content/inside.txt

My command is:

 rsync -nrci  --include-from="file" source/ destination

EDIT:

Let me explain the winning answer:

Here is the order of paths rsync process:

 dsadcache.txt
 txt-file-in-root.txt
 cache/
 cache/fileincac.txt
 cache/fileincache.txt
 wp-content/
 wp-content/inside.txt   
 wp-config.php

Without including

filter='+ */'

directories

cache/
wp-content/

are excluded.


Solution

  • In recursive mode rsync visits subdirectories from the top down, so wp-content is matched against your rules first when rsync checks the top level of your tree. As there is no inclusion pattern that matches this directory, the generic exclusion rule - * drops it.

    According to rsync manpage, one way of achieving your goal is to place a + */ anywhere before the exclusion rule, so subdirectories are included during recursive operation.