实习笔记----用脚本实现文件夹双向同步(备份)

 
 

实际问题是这样的:我的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全都不认识了。其实完全可以先用手动复制的方法建好文件结构然后再备份。大家有什么其他好方法?


你可能感兴趣的:(实习笔记----用脚本实现文件夹双向同步(备份))