递归备份/恢复bash脚本

时间:2014-03-27 14:54:26

标签: bash

有关可执行以下操作的备份/恢复脚本的任何想法:

以递归方式备份/恢复文件和目录的脚本,显示每个目录的提示是否要进行备份/恢复。 例如,假设我们有以下文件和目录:

base path: /home/me/Downloads/test    
dir: /home/me/Downloads/test/1    
dir: /home/me/Downloads/test/1/1a    
file: /home/me/Downloads/test/1/filein1    
dir: /home/me/Downloads/test/2    
dir: /home/me/Downloads/test/3   
dir: /home/me/Downloads/test/4    
file: /home/me/Downloads/test/4/filein4    
file: /home/me/Downloads/test/backup.sh    
file: /home/me/Downloads/test/get_dirs_files.sh    
file: /home/me/Downloads/test/restore.sh    
file: /home/me/Downloads/test/script.sh    

脚本应该备份所有文件和目录,但是应该为每个目录提示我们是/否,而不是树中的文件。

我正在尝试这个:

#!/bin/bash

get_dirs= eval "find . -type d -exec echo \"{}\" \;"

echo $get_dirs

echo "|  BACKUP YOUR SYSTEM: "
OPTIONS="Backup Exit"
LIST="1) Backup 2) Exit" 

select opt in $OPTIONS; do
if [ "$opt" = "Exit" ]; then
    clear
    exit

elif [ "$opt" = "Backup" ]; then
    tar jcvpfw /backup.tar.bz2 $get_dirs
    echo "BACKUP COMPLETE"
    exit

else
    clear
    echo "| BAD OPTION! Select 1 or 2"
    echo "|--------------------------------------------------------------"
    echo "|  BACKUP YOUR SYSTEM: "
    echo $LIST
fi
done

因为我可以通过find . -type d -exec echo "{}" \;

获取所有目录

并且还使用tar的w选项进行交互式存档,但这并不能完全备份当前目录中的所有文件。

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

#/bin/bash

default_path=/home/user # or something else

if [[ -z ${1} ]]; then
    backup_path=${default_path}
else
    backup_path=${1} # sets if script got an argument with backup path
fi

all_dirs=`find ${backup_path} -type d`
backup_list=""

for dir in `echo ${all_dirs}`; do
    echo "${dir} [y/n/skip]: "
    read answer
    if [[ ${answer} == "y" ]]; then
        backup_list="`echo ${backup_list}` ${dir}"
    fi

    if [[ ${answer} == "skip" ]]; then
        break
    fi
done

tar -czpf backupfile.tar.gz ${backup_list}

exit 0

我认为即使没有评论,代码也非常简单。它不是整个任务的解决方案,但你可以使用这个想法。