cp command to exclude certain files from being copied
Is there a way to use command 'cp' to copy a directory and exclude certain files/sub-directories within it?
Solution 1:
Use rsync
:
rsync -avr --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*
Copied From: https://stackoverflow.com/a/2194500/749232
If you want to use cp
itself:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
This assumes the target directory structure is the same as the source's.
Copied From: https://stackoverflow.com/a/4586025/749232
Solution 2:
Late into the game but here is a very different solution using plain bash and cp: you can use a global file specification while having some files ignored.
Assume the directory contains the files:
$ ls *
listed1 listed2 listed3 listed4 unlisted1 unlisted2 unlisted3
Using the GLOBIGNORE variable:
$ export GLOBIGNORE='unlisted*'
$ ls *
listed1 listed2 listed3 listed4
Or with more specific exclusions:
$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1 listed2 listed3 listed4 unlisted3
Or using negative matches:
$ ls !(unlisted*)
listed1 listed2 listed3 listed4
This also supports several unmatched patterns:
$ ls !(unlisted1|unlisted2)
listed1 listed2 listed3 listed4 unlisted3
Solution 3:
Quick Start
Run:
rsync -av --exclude='path1/in/source' --exclude='path2/in/source' [source]/ [destination]
Notes
-
-avr
will create a new directory named[destination]
. -
source
andsource/
create different results:-
source
— copy the contents of source into destination. -
source/
— copy the folder source into destination.
-
- To exclude many files:
-
--exclude-from=FILE
—FILE
is the name of a file containing other files or directories to exclude.
-
-
--exclude
may also contain wildcards:- e.g.
--exclude=*/.svn*
- e.g.
Modified from: https://stackoverflow.com/a/2194500/749232
Example
Starting folder structure:
.
├── destination
└── source
├── fileToCopy.rtf
└── fileToExclude.rtf
Run:
rsync -av --exclude='fileToCopy.rtf' source/ destination
Ending folder structure:
.
├── destination
│ └── fileToExclude.rtf
└── source
├── fileToCopy.rtf
└── fileToExclude.rtf