Linux拷贝排除一个或多个目录的实现方法

文章目录:

  • 一、用cp命令实现
  • 二、用rsync命令


你有没有想要拷贝某个目录下的很多文件或者目录,但是又偏偏有几个文件你不想要拷贝,有人说可以全部拷贝过去再删除呀,但是关键这几个文件可能很大很大,这个时间成本怎么算呀,好吧,那我们就来一个 “一致对外” 策略!!!


建议采用rsync命令,方便快捷

一、用cp命令实现

/home目录里面有data和photo目录,data目录里面有test1,test2,test3,test4四个目录,现在要把data目录里面除test4目录之外的所有目录拷贝到photo目录中

cp -r find /home/data -type d -path /home/data/test4 -prune -o -print | sed 1d /home/photo

上述命令参数说明:

  1. find /home/data -type d 找出该目录下的文件夹,如果是-type f则是找出该目录下的文件。
  2. 再加上路径选项:-path /home/data/test4表是找出/home/data指定路径下的文件夹。
  3. -prune:使得find命令不进入到当前路径。
  4. -o类似于逻辑或运算,find /home/data -type d -path /home/data/test4 -prune -o -print是find /home/data -type d -path /home/data/test4 -a -prune -o -print的缩写。

其中-a相当于逻辑与&&,-o相当于逻辑或||,上述命令等价于:

if -path “/home/data/e” then

-prune

else

-print

意思就是查找/home/data目录下的文件夹,如果路径是/home/data/e,就执行“-prune”(跳过)操作,如果不是该路径,则执行 “-print”(打印)操作。

  1. sed 1d:通过管道执行该命令,表示上面查找出来的文件列表删除第一行(/home/data),即根目录不需要加进来,否则的话就相当于把所有文件夹进行了拷贝。

二、用rsync命令

ync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync 本来是文件同步备份的工具,相对于普通的 cp 命令,rsync 在控制方面就强多了,而且 rsync 对遍历目录也支持,有 --exclude参数可以忽略指定的文件或文件夹。

/home目录里面有data和photo目录,data目录里面有test1,test2,test3,test4四个目录,现在要把data目录里面除test3和test4目录之外的所有目录拷贝到photo目录中

cd /home/data
rsync -av --exclude  test3/ --exlclude test4/  ../data/  /home/photo

上述命令参数说明:
-a参数表示archive模式(-a 参数已经包含遍历处理参数 -r),-v表示详细链模式输出,-z表示传输文件时使用压缩传输的模式。

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