免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9387 | 回复: 19

[学习共享] bash 下使用 cp 命令的 --parents 参数 实现递归拷贝 (付递归删除) [复制链接]

论坛徽章:
0
发表于 2013-07-24 10:18 |显示全部楼层
本帖最后由 ailms 于 2013-07-24 11:03 编辑

原文地址 :http://blog.ailms.me/2013/07/23/ ... d-del.html#more-607

把脚本部分改为文本了,另外有同学说用 rsync 可以实现。是的,用 rsync 更方便,不过这个是另外一个实现方式而已,我的主要目的是说明 cp 命令的 --parents 参数

今天一前同事在 QQ 上问如何实现将 A 目录下的某个子目录(例如 A/sub1/sub2/sub3/file1) 拷贝到目录 B ,并保持目录结构。

王XX 17:35:47
              我现在要查询一个目录,有很多层,找到最后一层,把路径返回来

王XX 17:35:59
              最后一层可能是目录,也可能是文件

boblin 17:37:01
             有没有截图啊,这个不是很好理解。你只要最后一层吗?

王XX 17:38:20
              需求是这样的,现在有两个目录,我要把一个目录文件拷贝到另外一个目录里,层次和原目录不变

王XX 17:38:29
             删除也按照原目录删除

boblin 17:39:15
            知道你意思了,就是你想 cp 文件,同时保留目录结构是把?

王XX 17:39:55
             对

这个需求本身并不难,可能大部分人想到的就是对原路径稍微做下处理,截取目录部分,然后作为参数传给 mkdir -p 。然后再 cp 文件。

这个并不是不可以,但略显麻烦,可以 有更简单的做法,就是

  1. #!/bin/bash

  2. srcDir=$(readlink -e -f $1)

  3. dstDir=$(readlink -e -f $2)

  4. (

  5.   if [ "$3" = "update" ] ; then

  6.        cd $srcDir && find . -type f | xargs -n 1 -i cp -u -v --parents {} $dstDir
  7.   else
  8.        cd $srcDir && find . -type f | xargs -n 1 -i cp -v --parents {} $dstDir
  9.   fi

  10. )
复制代码
效果如下



既然有递归拷贝,但自然要有递归删除了。同样很简单

下面是原始目录的内容。要将 dstdir/ 目录下的内容变成跟 srcdir 一样


  1. #!/bin/bash

  2. srcDir=$(readlink -f -e $1)

  3. dstDir=$(readlink -f -e $2)

  4. delList=$(join -v 2 <(cd $srcDir ; find . | sort) <(cd $dstDir ; find . |sort) | awk '{print $0,length($0)}' | sort -k2,2rn | awk '{print $1}')

  5. if [ -n "$delList" ] ; then

  6.     cd $dstDir
  7.    
  8.     while read name ; do
  9.    
  10.         if [ -f $name ] ; then
  11.    
  12.              rm -v $(readlink -f -e $name)
  13.    
  14.         elif [ -d $name ] ; then
  15.    
  16.              rmdir -v $(readlink -f -e $name)
  17.         fi
  18.    
  19.     done <<< "$delList"

  20. else
  21.     echo "nothing to del"
  22. fi
复制代码
效果如下

论坛徽章:
50
15-16赛季CBA联赛之广夏
日期:2018-11-05 09:42:462015年亚冠纪念徽章
日期:2015-07-23 11:58:122015亚冠之广州富力
日期:2015-07-07 08:26:172015亚冠之塔什干棉农
日期:2015-06-29 09:08:072015年亚洲杯之伊朗
日期:2015-03-08 20:51:012015年迎新春徽章
日期:2015-03-04 09:58:11未羊
日期:2014-10-16 22:41:47处女座
日期:2014-10-16 15:33:33酉鸡
日期:2014-03-13 12:54:10巳蛇
日期:2014-03-10 14:39:052015亚冠之德黑兰石油
日期:2015-07-29 12:46:372015亚冠之德黑兰石油
日期:2015-08-07 12:54:11
发表于 2013-07-24 10:37 |显示全部楼层
谢谢分享!

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
发表于 2013-07-24 10:41 |显示全部楼层
用rsync不就可以很容易的可以实现

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2013-07-24 10:45 |显示全部楼层
不明觉厉..

论坛徽章:
0
发表于 2013-07-24 10:52 |显示全部楼层
回复 3# 代号:军刀


是的,rsync 也可以,这只是一个 bash 的例子   

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2013-07-24 10:52 |显示全部楼层
搞复杂了吧。

另外,建议贴文本。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2013-07-24 10:54 |显示全部楼层
谢谢分享!

论坛徽章:
0
发表于 2013-07-24 15:04 |显示全部楼层
不明觉厉!!!

论坛徽章:
0
发表于 2013-07-24 15:48 |显示全部楼层
谢谢楼主分享,我一般用tar 命令来干这事,似乎速度也挺快
  1. tar c $(find /path/to/src/dir -type f ) | tar x -C /path/to/dest/dir
复制代码

论坛徽章:
1
射手座
日期:2014-03-10 14:24:52
发表于 2013-07-24 16:40 |显示全部楼层
不明觉厉!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP