方法一:终端命令行下执行以下命令

cp -R `find /home/data -type d  -path /home/data/e  -prune -o -print | sed 1d ` /bak

find A ! -name 100 ! -name 101 -exec cp {} somedir/{} \; 

 

使用cp命令复制的时候,只能排除一个目录不被复制,如果想排除两个或者多个目录的话,就需要使用rsync命令来实现了,看下面的例子

方法二: 
如果要排除/home/data目录下面的a、b、c、三个目录,同时拷贝其它所有目录,执行以下命令

 

rsync -av --exclude data/a  --exclude data/b  --exclude data/c  data   /bak

 

 

注意:--exclude后面的路径不能为绝对路径,必须为相对路径才可以,否则出错。




使用 find 加 cpio 进行拷贝:

备注:此方法来自 Advanced Bash-Scripting Guide,需要了解的童鞋自己去参考了。

用 过 find 的童鞋都知道,find 对文件的过滤那是非常强大的,配合 cpio 来进行目录的遍历拷贝就可以实现过滤指定的文件或文件夹,当然也可以做到只备份特定的文件或文件夹,你可以用 find 的各种过滤参数达到拷贝哪天的文件,拷贝近期更改的文件等特殊效果,而且 find 支持正则表达式,这种方式想比第一种使用 rsync 跳过文件的方式更加灵活,因此非常推荐使用此方式进行目录拷贝。

cd dir1
find . -regextype posix-egrep -mindepth 1 ! -regex ‘./(dev|tmp)($|/.*)’ ! -name Makefile -a ! -name .svn | cpio -admvp /home/dir2

小解释下:

find 的 -regextype 参数指定正则表达式类型,posix-egrep 为 egrep 用的扩展正则表达式,-mindepth 使 find 的输出中不包括目录本身,-regex 参数指定过滤的文件的正则表达式,-regex 前面的感叹号表示跳过,’./(dev|tmp)($|/.*)’ 这个正则表达式即表示跳过目录中的第一层 dev 和 tmp 目录以及下面所有的文件和文件夹,最后两个 -name 指定要跳过文件名为 Makefile 和 .svn 的文件,这样在备份版本库的时候非常有用。