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内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码

如何实现linux自动压缩指定日志

Linux云计算就业班第四周作业

VMware Workstation/Fusion 中安装 Fedora 23/24 及其他 Linux 系统时使用 Open VM Tools 代替 VMware Tools 增强工具的方法(代码片

linux基础总结

对微信的聊天记录数据库文件EnMicroMsg.db.bak的加密方式都有哪些?