实现一个特殊的备份工具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
#           echo "前: $string"                                                                                                                                                                                                               string=$string$slash${array[$i]}
#           echo "后: $string"                                                                                                                                               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相关推荐

  1. 【Linux】Rsync远程同步及备份工具(Rsync简介、Rsync安装、rsync认证方式)

    一.Rsync简介 rsync(Remote synchronization)是Liunx/Unix下的一个远程数据同步工具. 它可通过LAN/WAN(局域网/广域网)快速同步多台主机间的文件和目录, ...

  2. linux备份工具比较,2020年Linux最好的5个备份工具

    在本文中,我们将介绍可在Linux服务器或系统上使用的5个出色的备份工具. CloudBerry Backup CloudBerry Backup for Linux是一个跨平台的云备份解决方案,有高 ...

  3. 手机 linux 备份软件有哪些,八款免费Linux备份工具汇总(附下载)

    [IT168 导购]据国外媒体报道,用户常常会因为某种原因而丢失重要的数据,这会导致用户时间甚至金钱上的损失.针对这种情况,市场中先后出现了很多的Linux备份工具. 目前,大多数的备份工具还提供压缩 ...

  4. linux增量备份目录,linux下的增量备份工具rsnapshot介绍

    本人一直在用群晖上的 Timebackup 插件,对群晖里面的资料进行定时备份(把某个时间点的状态保存下来,以备将来查询的需要),觉得非常方便,我用了几年了,无奈官方现在逐渐放弃了对 Timeback ...

  5. linux 监控微信通知,一个 Linux 下基于 Bash 的文件和数据库监控及备份工具,可发送微信报警通知...

    shellMonitor 一个 Linux 下基于 bash 的文件和数据库监控及备份工具. 写这个工具的原因,在于一个朋友的一个小电商网站,因为未明原因被黑了,总是会被增加超级管理员,并将收款账号改 ...

  6. 四大Linux备份工具比较与操作实例

    标准的UNIX系统皆有提供基本的备份工具,不同的备份工具有不同的差异.dump,cpio,tar及dd,dump及restore通常是最好的选择.其次是cpio,但是它比tar来的不亲和些:tar则比 ...

  7. Linux下的数据备份工具rsync

    Linux下的数据备份工具很多,用得最多的是rsyns(远程同步) 同步远程数据类似scp 同步本地数据类似cp root@ip-172-31-8-212:~# rsync /etc/passwd / ...

  8. 超全Linux备份工具集合,满足你的所有需要!

    经常备份计算机上的数据是个好的做法,它可以手动完成,也可以设置成自动执行.许多备份工具拥有不同的功能特性,让用户可以配置备份类型.备份时间.备份对象.将备份活动记入日志及执行更多操作. 1.Rsync ...

  9. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步

    1.什么是 Rsync? Rsync 是一个开源的快速备份工具,是Linux和UNIX操作系统默认安装的组件之一,可在不同主机间镜像同步整个目录,并支持增量备份文件传输,保持链接和权限,采用优化的同步 ...

最新文章

  1. 题目1460:Oil Deposit
  2. Visual Studio UML Use Case Diagram(2)
  3. GitHub告急!黑客威胁程序员不交钱就删库
  4. apache与tomcat的联系
  5. glacier2_Amazon Glacier的Scala客户端
  6. Cocos2dx实现象棋之布局
  7. windows消息宏(转)
  8. Sublime text 3 快捷键
  9. ios开发错误之: Undefined symbols for architecture x86_64
  10. 宿主机无法访问docker容器的坑
  11. 思科下一代模拟器EVE-NG安装
  12. 树莓派机器视觉环境搭建
  13. win10系统steam连接不上服务器,win10系统steam无法连接到更新服务器的解决方法
  14. c# 解决:Panel 添加自定义控件后滚动条跳动问题
  15. doc命令大全(经典收藏)
  16. css样式的叠加,CSS的叠加
  17. 配置FCKeditor出现严重问题,调试时报错:
  18. 腰椎间盘突出,睡硬床垫还是软床垫好?听骨科医生答疑
  19. 怎么把PDF转网页HTML?建议收藏这些方法
  20. 基于neo4j知识图谱的旅游景点问答辅助系统

热门文章

  1. 假如我年少有为不自卑
  2. 网络数据帧中的(Jumbo Frame)巨帧、超长帧
  3. 优化PyTorch性能的一些trick
  4. Kibana查询语言(KQL)AND、OR匹配,模糊匹配
  5. 【系统分析师之路】2017年系统分析师上午综合知识历年真题
  6. mytrader-开源股票期货金融软件+支持C/C++/Python/Excel/VBA/麦语言的量化分析交易平台
  7. macbook 安装iperf_【优秀的网络性能测量工具----Iperf】-Linux/Unix/MAC OSX操作系统论坛-ZOL中关村在线...
  8. TyoeScript
  9. 详细记录丨公众号如何通过迁移开通留言功能?
  10. 游戏服务器和网站,大型网络游戏和大型网站需要服务器的不同