Linux作业 实现一个特殊的备份工具bak
Posted _DiMinisH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux作业 实现一个特殊的备份工具bak相关的知识,希望对你有一定的参考价值。
实现一个特殊的备份工具bak
1. 备份命令格式:bak dir1 dir2
功能:
将dir1中的所有文件(含子目录中的文件)备份到dir2目录,且将所有子目录以“-”连接
例
dir1/a/b/c文件将备份为dir2/a-b-c
2. 恢复命令格式:bak -x dir1 dir2
功能:将dir1中的所有文件恢复到dir2目录,并还原备份前的目录结构
例如,bak -x dir2 dir3,将原备份的文件恢复到一个新的目录dir3
程序代码及注释
#!/bin/bash
# 如果参数个数为2一下, 直接退出脚本,
if [ $# -lt 2 ]; then
exit 1
fi
# 定义变量
string=""
current_parent_dir_name=""
flag=0
slash="/"
option="-x"
a="-"
# 不为还原选项
if [ ! $1 = $option ]; then
parent_dir_name=$1
ls -R $1 | while read line; do
# echo "读入的是:$line"
# 获取父目录名字
if [ $flag -eq 0 ]; then
flag=1
length=$#line
let length_1=$length-1
current_parent_dir_name=$line:0:$length_1
# echo "当前父目录名字:$current_parent_dir_name"
else
file_name="$current_parent_dir_name$slash$line"
# echo "文件名:$file_name"
# 如果是普通文件
if [ -f $file_name ]; then
# echo "普通文件, line=$line" # echo "当前父目录名字:$current_parent_dir_name"
for (( i=0; i<$#current_parent_dir_name; i++)); do
char=$current_parent_dir_name:$i:1
if [ $char = $slash ]; then
char="-"
fi
string=$string$char
done
# echo "当前父目录名字:=$current_parent_dir_name 拼接后父目录名字:$string"
# 主目录下面拷贝过去, 直接拷贝
if [ $parent_dir_name = $string ]; then
string="$2$slash$line" # echo "string=$string"
cp $file_name $string
# 子目录拷贝过去, 文件名改变
else
# 除去主目录的名称
# echo "主目录的名称:$parent_dir_name, 长度:$#parent_dir_name"
# echo "前:$string"
string=$string:$#parent_dir_name+1:$#string
# echo "后:$string"
# 目录名-文件名
string="$string$a$line"
# 拷贝目录名 / 拷过去要改的名字
string="$2$slash$string"
# echo "cp $file_name $string"
cp $file_name $string
fi
# 如果是空 ""
elif [ $#line -eq 0 ]; then
flag=0 # echo "flag置换"
fi
string=""
fi
done
# 还原选项
elif [ $1 = $option ]; then
parent_dir_name=$3
index=0
ls $2 | while read line; do
# 遍历文件名, 找出目录和文件名
# echo "参数长度:$#line"
for(( i=0; i<$#line; i++)); do
char=$line:$i:1
# echo "char=$char"
if [ $char = $a ]; then
array[$index]=$string
# echo "array[$index]=$array[$index]"
let index=$index+1
string=""
else
string="$string$char"
fi
done
array[$index]=$string
# echo "array[$index]=$array[$index]"
file_name=$array[$index]
string=""
for (( i=0; i<$index; i++)); do
let s=$i-1
# 拼接成要还原的目录下的路径
if [ $i -eq 0 ]; then
string=$parent_dir_name$slash$array[$i]
else
string=$parent_dir_name$slash$array[$s]$slash$array[$i]
fi
# echo "路径:$string"
# 目录不存在就创建
if [ ! -d $string ]; then
# echo "mkdir $string"
mkdir $string
fi
let j=$i+1
# echo "j=$j, index=$index"
# 当前目录是最后一级目录
if [ ! $j -lt $index ]; then
# 除去文件前缀
length=0
for (( i=0; i<$index; i++)); do
if [ $i -eq 0 ]; then
let length=$#array[$i]+length
else
let length=$#array[$i]+length
let length=$length+1
fi
done
# echo "length=$length"
let length=$length+1
r=$line:$length:$#line
# echo "r=$r"
line=$2$slash$line
string=$string$slash$r
echo "cp $line $string"
cp $line $string
fi
done
if [ $index -eq 0 ]; then
line=$2$slash$line
# echo "cp $line $parent_dir_name$slash"
cp $line $parent_dir_name$slash
fi
string=""
index=0
done
fi
以上是关于Linux作业 实现一个特殊的备份工具bak的主要内容,如果未能解决你的问题,请参考以下文章
linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码
VMware Workstation/Fusion 中安装 Fedora 23/24 及其他 Linux 系统时使用 Open VM Tools 代替 VMware Tools 增强工具的方法(代码片