实习笔记----用脚本实现文件夹双向同步(备份)
来源:互联网 发布:如何精通c语言 编辑:程序博客网 时间:2024/06/10 04:31
实际问题是这样的:我的workspace需要向两个svn地址提交,一个是公司的,一个是个人项目收藏的(开源软件公司所以代码公开的:)直接commit的话只能提交一个,所以我只能又拷贝了一个工作区,每次在主工作区有改动以后手动同步到第二个工作区然后提交;而且还不能直接全部复制并替换因为svn的隐藏文件夹内容是不同的。为此我发了两个帖并得到了一些启发,经过一下午的钻研,我这个linux新手总算写出了第一个实用脚本(虽然去掉注释没几行。。。)
#!/bin/bash #create hard link (or just copy) everything from $1 to $2/$1#Ex: If you want to backup your repository 'repo' to 'repo-back', goto repo directory and use "./backup.sh . repo-back"#Find target files and delete "^./" if there is.for file in $(find $1 -type f | egrep -v '.svn|.class|.jar|/bin/|/gen/|~' | sed "s/\.\///")do #create directory for each file echo $2/$file | sed "s/\/[^\/]*\.[a-z]*$//" | xargs mkdir -p #create hard link for each file ln -f $file $2/$file #cp -Tufr $1$file $2$file done
简单说几句:
find命令可以打印出需要备份的所有文件;
egrep -v 从中过滤掉路径中包含“.svn|.class|.jar|/bin/|/gen/|~”的文件,第一个是svn的隐藏文件夹包含了版本控制的相关信息,最后的波浪线代表临时文件,中间的东西都是不需要备份的;
如果打印出的列表以./开头,也就是用户输入的第一个参数可能是'.',就用sed把./过滤掉以便后面的拼接操作;
然后的任务是建立不存在的文件夹,sed的作用是把当前的文件列表变成文件夹列表---把每条最后的.../file.java 变为.../。然后建立不存在的文件夹,我对此感到奇怪,按理说不存在的文件夹应该有选项使其自动生成的,但是我没找到...
最后在for循环中为每个文件创建硬链接。所谓硬链接,我的理解是,生成的链接其实与源文件是同一块存储区,也就是说源文件改变的话硬链接也改变,包括文件大小等都是一样的,但是源文件删除的时候硬链接依然存在,因为只要有这样的链接存在linux就不会真正删除存储内容;
小心哦,硬链接是双向备份,不愿意用硬链接的话也可以用注释中的cp命令,手动单向备份;
经测试,硬链接用来备份实在很完美,做的改动同时在两个文件夹生效 :)
当然了还有很多更简单的方法,如rsync等,我暂时还没学,大家多发表意见吧。
我发的两个帖子,可以参考:
http://forum.ubuntu.org.cn/viewtopic.php?f=21&t=381944
http://topic.csdn.net/u/20120724/03/46f97ddc-7015-4142-81fd-7e40083f31d6.html
P.S. 关于cp命令不能自动创建不存在的文件夹,有同学给出这样的命令:
test -d "$d" || mkdir -p "$d" && cp file "$d"
另外cp -p 也可以考虑,但是实用效果好像有些问题,貌似即便文件夹存在也会被重新建立,导致我的svn全都不认识了。其实完全可以先用手动复制的方法建好文件结构然后再备份。大家有什么其他好方法?
- 实习笔记----用脚本实现文件夹双向同步(备份)
- 使用unison实现文件夹双向同步
- BestSync文件夹同步(备份)
- 实现一个文件夹同步的shell脚本
- 文件夹备份脚本.bat
- 如何用脚本实现提交时同步备份
- 本地文件夹同步/备份工具
- 本地文件夹同步/备份软件
- 本地文件夹同步/备份软件
- mysql双向同步热备份设置
- 批处理实现文件夹同步
- Rsync实现文件夹同步
- 批处理实现文件夹同步
- mysql数据双向同步实现
- unison实现文件双向同步
- mysql 实现主从双向同步
- linux下如何实现用脚本备份
- 用 bash 实现临时备份还原脚本
- 算法系列(二) 归并排序
- 小程序
- C++中的string用法(一)
- ant+svn简化打版本的方法(j2ee)
- 利用eclipse external tool 执行mvn jetty:run
- 实习笔记----用脚本实现文件夹双向同步(备份)
- 资深层序员的20条建议
- 关于UITABLEVIEW的使用说明
- C++中的string用法(二)
- Oracle数据库执行计划的一些基本概念
- linux下库文件的类型
- 用itoa()函数将整数转换为字符串
- WinForm 鼠标经过按钮 按钮抖动一下
- win 下gvim 中文显示乱码解决办法