实习笔记----用脚本实现文件夹双向同步(备份)
#!/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全都不认识了。其实完全可以先用手动复制的方法建好文件结构然后再备份。大家有什么其他好方法?