•虚拟机数量:1
•系统版本:Centos 7.5
数据备份是系统管理工作中的重要内容。简单的文件备份工作主要是将重要的数据文件,如一些系统和网络服务器的配置文件、用户个人数据文件、数据库文件等复制到一个指定的地方。
显然,备份工作往往是需要反复执行的,而且还可以制定备份计划,指定在某个时间点执行备份工作。因此,有必要编写脚本以实现备份工作的自动执行。
本实验将编写脚本对指定目录下的具有可执行权限的普通文件进行备份,而备份文件的存放路径是用户主目录下的备份目录,备份目录名称为“backup”并附上当前系统日期。
第1步: 编写命令获取指定目录中的文件列表。显然需要用到ls命令获取文件列表并且将其记录在变量dirlist中,可以在命令行中先进行测试,假设现在需要备份的目标目录为用户主目录下的shellscript(它存放了一些脚本文件以及相关的输出数据文件):
[root@localhost ~]# filelist=`ls /root/shellscript`
[root@localhost ~]# echo $filelist
brk-continue.sh cmpnumber.sh cmpstring.sh dircheck.sh divide-new.sh inverse.sh logfile max.sh printname.sh printnumber.sh statIP.log statIP.sh symbolkind.sh
[root@localhost ~]#
注意:filelist=`` 这里是‘’~‘’键盘上的符号,并不是单引号
第2步, 编写命令创建备份目录。显然需要使用mkdir命令创建备份目录,但问题的关键在于需要给定备份目录的名称,根据目标要求,在命令行中做测试:
[root@localhost ~]# echo $HOME/backup `date`
/root/backup 2021年 06月 07日 星期一 15:08:35 CST
但由于上述生成的字符串过长,并不适合用于文件命名,因此需要修改生成时间字符串的格式,如下:
[root@localhost ~]# echo $HOME/backup `date "+%Y%m%d%H%M%S"`
/root/backup 20210607151144
第3步, 构建脚本的基本框架。根据之前的实验结果,可以编写代码如下,将其保存为脚本backup-frame.sh:
#!/bin/bash
#检查是否有一个参数用于制定备份目录
if [ $# -ne 1 ]; then
echo "please input the backup directory"
exit
fi
#检查备份的目标目录是否有效
if [ ! -d $1 ] || [ ! -e $1 ]; then
echo "wrong: bad directory path"
exit
fi
filelist=`ls $1`
backupdir="$HOME/backup`date`"
mkdir "$backupdir"
for filename in $filelist
do
echo $filename
done
添加可执行权限:
[root@localhost ~]# chmod u+x backup-frame.sh
测试该脚本框架是否可行,注意在测试前自行建立备份目录的目标目录并在其中放置需要备份的文件:
[root@localhost ~]# ./backup-frame.sh /root/file <==file是文件
wrong: bad directory path
[root@localhost ~]# ./backup-frame.sh /root/sh <==/root/sh这个目录不存在
wrong: bad directory path
[root@localhost ~]# ./backup-frame.sh /root/shellscript/
brk-continue.sh
cmpnumber.sh
cmpstring.sh
dircheck.sh
divide-new.sh
inverse.sh
logfile
max.sh
printname.sh
printnumber.sh
statIP.log
statIP.sh
symbolkind.sh
第4步, 编写关于备份功能的脚本代码。将backup-frame.sh脚本另存为backup.sh脚本,
[root@localhost ~]# cp backup-frame.sh backup.sh
修改backup.sh脚本的代码如下,主要增加了文件属性的判断以及复制备份的功能代码:
#!/bin/bash
#检查是否有一个参数用于制定备份目录
if [ $# -ne 1 ]; then
echo "please input the backup directory"
exit
fi
#检查是否备份的目标目录是否有效
if [ ! -d $1 ] || [ ! -e $1 ]; then
echo "wrong: bad directory path"
exit
fi
filelist=`ls $1`
backupdir=$HOME/backup`date "+%Y%m%d%H%M%S"`
mkdir $backupdir
echo "now start backuping, the directory name is $backupdir"
#开始备份
for filename in $filelist
do
if [ -f "$1/$filename" ] && [ -x "$1/$filename" ]; then
cp "$1/$filename" "$backupdir/$filename"
fi
done
其中最下面if 判断里面,第一个条件是 判断是不是文件 第二个条件是判断 有没有可执行权限
执行脚本,结果如下:
[root@localhost ~]# ./backup.sh /root/shellscript/
now start backuping, the directory name is /root/backup20210608110030
[root@localhost ~]# ls -l /root/backup20210608110030
总用量 0
-rwxr--r--. 1 root root 0 6月 8 11:00 brk-continue.sh
-rwxr--r--. 1 root root 0 6月 8 11:00 cmpnumber.sh
-rwxr--r--. 1 root root 0 6月 8 11:00 cmpstring.sh
-rwxr--r--. 1 root root 0 6月 8 11:00 dircheck.sh
-rwxr--r--. 1 root root 0 6月 8 11:00 divide-new.sh
-rwxr--r--. 1 root root 0 6月 8 11:00 inverse.sh
-rwxr--r--. 1 root root 0 6月 8 11:00 max.sh
-rwxr--r--. 1 root root 0 6月 8 11:00 printname.sh
-rwxr--r--. 1 root root 0 6月 8 11:00 printnumber.sh
-rwxr--r--. 1 root root 0 6月 8 11:00 statIP.sh
-rwxr--r--. 1 root root 0 6月 8 11:00 symbolkind.sh
通过编写脚本,成功地备份了/root/shellscript 目录下的具有可执行权限的文件 到/root/backup+时间 的目录下