Copy folder recursively, excluding some folders Copy folder recursively, excluding some folders unix unix

Copy folder recursively, excluding some folders


Use rsync:

rsync -av --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination

Note that using source and source/ are different. A trailing slash means to copy the contents of the folder source into destination. Without the trailing slash, it means copy the folder source into destination.

Alternatively, if you have lots of directories (or files) to exclude, you can use --exclude-from=FILE, where FILE is the name of a file containing files or directories to exclude.

--exclude may also contain wildcards, such as --exclude=*/.svn*


Use tar along with a pipe.

cd /source_directorytar cf - --exclude=dir_to_exclude . | (cd /destination && tar xvf - )

You can even use this technique across ssh.


You can use find with the -prune option.

An example from man find:

       cd /source-dir       find . -name .snapshot -prune -o \( \! -name *~ -print0 \)|       cpio -pmd0 /dest-dir       This command copies the contents of /source-dir to /dest-dir, but omits       files  and directories named .snapshot (and anything in them).  It also       omits files or directories whose name ends in ~,  but  not  their  con‐       tents.  The construct -prune -o \( ... -print0 \) is quite common.  The       idea here is that the expression before -prune matches things which are       to  be  pruned.  However, the -prune action itself returns true, so the       following -o ensures that the right hand side  is  evaluated  only  for       those  directories  which didn't get pruned (the contents of the pruned       directories are not even visited, so their  contents  are  irrelevant).       The  expression on the right hand side of the -o is in parentheses only       for clarity.  It emphasises that the -print0 action  takes  place  only       for  things  that  didn't  have  -prune  applied  to them.  Because the       default `and' condition between tests binds more tightly than -o,  this       is  the  default anyway, but the parentheses help to show what is going       on.