利用scp不改变属性远程备份文件夹

前段时间,由于硬件故障,图片服务器宕机啦。文件服务程序倒是很简单,可以找到代码,很快就可以部署。但是几十个G的图片还在那台机器上,怎么办?之前从来没有文件备份过,死了,要挨骂了。好在硬件故障解决了,图片服务器也恢复了,业务正常了。主管说,你还是备份吧。之前也想过,但是给的机器就三台:一台CMS,一台接口,一台文件服务器(数据库都是dba统一管控的,不用我们管),没有多余的机器用来备份文件呀。去找主机运维要机器,死活不给,说你们交叉备份吧。好吧,只能这样了。

网上搜了下,现成工具多得是,不想用啊,麻烦。自己写脚本吧。

图片目录结构如下图:
利用scp不改变属性远程备份文件夹_第1张图片
结构很简单,一天一个目录,上传的图片就在每一天的目录里头。

主要思路:通过find命令找到指定时间段内的文件夹,然后以此作为参数xargs,递归把文件夹及文件下面的文件scp到另外一台机器。

先同步现有的文件,文件太多,大概有四五万,担心一次性同步参数个数超过xargs的限制,还是按时间一部分一部分同步吧。用的命令主要是find、xargs、scp,都是系统自带的。脚本如下:

find . -mtime +720 -mtime -727 -type d |xargs -I{
     } scp -r -p {
     } 192.168.159.6:/mnt/uploadfile/image/

其中 . 指当前目录;
其中 -mtime +720指720天以前的文件;
其中 -mtime -727指727天内的文件;
其中 -type d 限定文件夹,-type f限定文件;
其中 |xargs -I{} scp -r -p {},将前面的结果一个一个替换{};
其中 -r,递归整个目录;
其中 -p,保持原文件或者目录属性不变;
其中 192.168.159.6指远程主机(一般是ip,也可以是主机名);
其中 /mnt/uploadfile/image/指远程目录,如果远程目录不存在,则会自动创建;

注意:执行命令之前要先cd到当前目录。

现有的文件同步完了,以后每天的文件也要同步。脚本名称自定义,此处叫synimage.sh,内容如下:

find . -mtime -1 -type d |xargs -I{
     } scp -r -p {
     } [email protected]:/mnt/uploadfile/image/

注意:synimage.sh放在当前目录。

写定时任务,脚本如下:

############### 每天零点1分执行同步图片脚本 ###################
1 0 * * * /mnt/uploadfile/image/synimage.sh

这样就可以啦!亲测有效!!!

注意
①如果没有设置免密传输,传输过程会要求输入密码;如果传输多个文件,则需要多次输入密码
②可以设置免密传输;免密传输设置方法,网上多得是,这里不介绍。
③主机前可加用户名,如果不加则默认当前用户;格式如[email protected]

你可能感兴趣的:(linux,ssh,服务器)