Reputation: 11160
I want to rsync only certain file types (e.g. .py
) and I want to exclude some directories (e.g. venv
).
This is what I have tried:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
But it doesn't work.
What am I missing?
Upvotes: 2
Views: 3665
Reputation: 84551
With rsync
you do not need to use --include="*.py"
to include '*.py'
files in the copy. The --include
option will only include files that have been excluded by --exclude=
before. rsync
specifies **
as the wildcard specifier. For example, if you want to copy all .py
files in the current directory (and subdirectories), but not copy anything from the venc
directory, you can do something similar to:
rsync -uav --exclude="venc" **.py destination
(note -a implies -rlptgoD
)
which would recursively copy all .py
files in present working directory to destination
excluding the venc
directory.
To recursively copy only *.py
files from all directories below the current path excluding any venc
directories, you can build a temporary file with the results of find
containing the *.py
files and exclude files containing venc/
as part of the path, and then transfer all filenames in the temporary file using the --files-from
and --no-R
(no relative) options to rsync
as:
$ find /path/to -type f -name "*.py" | grep -v 'venc/' > tmpfile \
rsync -uav --no-R --files-from=tmpfile / host:/dest/dir \
rm tmpfile
This will capture all *.py
files in any subdirectories excluding all directories including the name venc/
and anything below them. The --no-R
option is needed to prevent the absolute filenames in tmpfile
from be taken as relative to the current working directory.
Upvotes: 1