Ubuntu 判断文件是否被修改并执行备份

需求是在关机的时候对ubuntu系统上的某些重要文件作备份,ubuntu系统是虚拟机,备份到云端的共享文件夹下。由于系统可能要频繁的进行开关机,或者在开机的过程不一定会去变更要备份的文件,所以希望能够实现一个逻辑能够在备份之前先检查一下,如果目标文件夹在本次开机过程中被修改了,就执行备份,如果没有就不执行备份。

基于这样的需求,我的思路是在脚本中分别获取系统的开机时间和要备份的目标文件的最后修改时间,然后进行比对,如果目标文件的最后修改时间大于系统启动时间,那么就执行备份,否则就不备份。

那么首先我们来尝试获取系统启动时间,可以"who -b"命令:

root@Server:/# who -b
         system boot  2018-05-11 09:55
接下来我们尝试获取要备份文件的最后修改时间,假如我们要备份跟目录下的tmp文件夹,所以需要先获取tmp文件夹的时间。我们可以使用"ls -l | grep tmp"命令获取tmp文件夹的详细信息,可以看到上次更改的时间是5月11号的12点17分。
root@Server:/# ls -l | grep tmp
drwxrwxrwt   9 root root       4096 May 11 12:17 tmp

上面的时间格式是"May 11",这显然是没有办法比较的,所以我们需要他输出类似"2000-01-01"的格式,那么如何改变输入时间信息的说格式呢?我们不妨先来尝试一下date命令,输入"date":

root@Server:/# date
Fri May 11 12:27:44 CST 2018

可以看到输出了当前时间,而时间格式也是用英文的格式输出的。不妨使用"--help"参数来查看以下详细信息,我们可以得到改变日期输出格式的资料,重新输入"date "+%Y-%m-%d %H:%M" "命令:

root@Server:/# date "+%Y-%m-%d %H:%M"
2018-05-11 12:05

可以看到日期的输出格式改变了,那么同样,我们可以在"ls"命令里面使用time-style参数,来指定文件修改时间的输出格式,下面我们重新输入"ls -l --time-style="+%Y-%m-%d %H:%M" | grep tmp"命令:

root@Server:/# ls -l --time-style="+%Y-%m-%d %H:%M" | grep tmp
drwxrwxrwt   9 root root       4096 2018-05-11 12:05 tmp

可以看到我们把时间都变成了我们想要的格式。

但是上面一行的输出中,我们所需要的信息其实只有时间而已,那么我们怎样才能将上面的时间提取出来呢?可以采用shell的分割字符串的命令"string:a;b"(a,b是具体的阿拉伯数字),表示从第a+1个字符开始截取,一共截取b个字符。比如我们可以写个测试脚本,利用"vi sample"命令打开编辑器,然后输入:

#!/bin/bash

samp="123456789 2000-01-01 00:00"
echo ${samp:10:16}

可以看到我们声明了一个samp字符串变量,他的前10位是数字,后面是日期格式,那么我们要从他的第11位开始截取,截取后面的16位。所以用"${samp:10:16}",那么我们现在更改一下他的 执行权限:

root@Server:/# chmod +x sample

然后执行以下脚本,可以看到输出了后面的日期格式:

root@Server:/# ./sample
2000-01-01 00:00

那么现在还有最后一个问题,这样格式的时间是没有办法比较的,所以我们还要把时间格式转化成可以进行数学比较的形式,可以使用"date -d"命令,将时间转化为从从1970年1月1日零点以后到现在的总秒数,这样就可以进行比较了,比如我们输入"date -d "2000-01-01 00:00" +%s"命令:

root@Server:/# date -d "2000-01-01 00:00" +%s
946656000 

这就表示2000年1月1日零点到1970年1月1日零点经过了946656000秒,如此一来时间就是可以使用算数比较的了。

那么我们现在就来完成这个脚本,可以用"vi tmp-backup"命令,打开编辑器,然后输入下面的脚本:

#!/bin/bash

BACKUP_CLOUD="/mnt/hgfs/cloud/"
BACKUP_DIR="tmp"
BACKUP_NAME="tmp-backup.tgz"

boot_info=`who -b`
boot_time=${boot_info:22:16}
boot_second=`date -d "${boot_time}" +%s`

file_info=`ls -l --time-style="+%Y-%m-%d %H:%M" | grep ${BACKUP_DIR}`
file_time=${file_info:28:16}
file_second=`date -d "${file_time}" +%s`

if [ ${file_second} > ${boot_second} ]; then
        cd /
        tar -zcvf ${BACKUP_CLOUD}${BACKUP_NAME} ${BACKUP_DIR}
fi

这样就可以把根目录下的tmp文件夹压缩在/mnt/hgfs/cloud/tmp-backup.tgz里面了,这里的/mnt/hgfs/cloud是已经挂载的ubuntu和云的共享文件夹。

关于如何在系统关机时进行备份,可以查看另一篇文章《Ubuntu添加开机/关机执行脚本与service的理解》。



猜你喜欢

转载自blog.csdn.net/hyklose/article/details/80278662
今日推荐