Linux作业 实现一个特殊的备份工具bak

书读的越多而不加思考,你就会觉得你知道得很多;而当你读书而思考得越多的时候,你就会越清楚地看到,你知道得很少。

导读:本篇文章讲解 Linux作业 实现一个特殊的备份工具bak,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

实现一个特殊的备份工具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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/122829.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!