需求提出
在公司使用svn、perforce等版本管理工具。对于多人共享的文件, 我有以下需求:
- 我不想频繁check in或submit改动到版本库,防止影响别人工作;
- 但我每修改一点都要及时备份,防止误删、未保存等误操作;
- 希望能够把改动的文件备份到较为安全的路径,至少不要在改动文件当前目录;
- 希望能够有多个备份进行容灾;
- 备份后的文件希望有时间戳展示改动时间,希望有相关改动描述。
脚本特性
为此,分享一个我多年前写的文件备份小脚本,除满足以上需求外,还支持以下feature:
- 支持文件夹内容备份
- 备份文件路径在源路径前添加备份文件夹的路径,比如源路径为/home/file1.c,备份文件夹路径为/backup,则备份后的文件路径在/backup/home/file1.c
- backup.log内存储备份信息,需要手动提供description,自动添加时间戳及文件的源路径及备份路径,在vim内可g + f直达。
- 考虑到个人手动备份次数不会太多,所有备份共享同一个backup.log
- backup.log多地保存,并ln软链到备份文件所在目录
脚本
脚本名backup.sh,为便于使用请在~/.bashrc
中添加 alias backup='~/script/backup.sh'
#! /bin/sh # usage: backup file "your description" # script_name: backup.sh # alias backup '~/script/backup.sh' tar=$1 description=$2 src=$(pwd) dst1=~/backup dst2=/proj/muhe/backup timestamp=$(date +%Y-%m-%d_%H:%M:%S) timestamp2=$(date +%Y%m%d%H%M%S) tarbak=$tar.$timestamp2 genlog() { log=$1 echo "------------------------------------------------------" >> $log echo "Description: $description" >> $log echo "Time Stamp : $timestamp " >> $log echo "From : $src/$tar " >> $log echo "To : $dst/$tarbak" >> $log echo " " >> $log } backup2path() { dst=$1$src if [ ! -d $dst ]; then mkdir -p $dst fi cp -rf $src/$tar $dst/$tarbak genlog $dst/$tar.log genlog $1/backup.log } main() { backup2path $dst1 backup2path $dst2 if [ ! -f backup.log ]; then ln -s $dst1/backup.log backup.log fi } main
以上脚本中备份到两地,如需更多备份,可在dst2后追加dstN
,并在main
函数中添加backup2path $dstN
完