您的位置:首页 > 运维架构 > Linux

linux下cp目录时排除一个或者多个目录的方法

2014-01-26 18:10 106 查看
方法一:终端命令行下执行以下命令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
的文件,这样在备份版本库的时候非常有用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 服务器 cp目录