MST
星途 面试题库

面试题:Bash脚本实现复杂代码备份恢复策略

假设你有一个项目代码仓库,其中包含多个子目录和不同类型的文件。要求编写一个Bash脚本,实现增量备份(仅备份修改过的文件),并能根据备份记录进行精确恢复,同时考虑文件权限和链接的处理。
13.3万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试
#!/bin/bash

# 备份目录
backup_dir="backup"
# 记录文件
record_file="backup_record.txt"

# 创建备份目录
mkdir -p $backup_dir

# 增量备份函数
function incremental_backup() {
    if [ ! -f $record_file ]; then
        touch $record_file
        find . -type f -not -path './backup/*' -exec cp -a {} $backup_dir \;
        find . -type f -not -path './backup/*' -printf "%P\t%T@\n" >> $record_file
    else
        while read -r line; do
            file_path=$(echo $line | cut -f1)
            last_modified=$(echo $line | cut -f2)
            current_modified=$(stat -c %Y $file_path 2>/dev/null)
            if [ -n "$current_modified" ] && [ $current_modified -gt $last_modified ]; then
                cp -a $file_path $backup_dir
                current_modified=$(stat -c %Y $file_path)
                sed -i "/^$file_path/d" $record_file
                echo "$file_path\t$current_modified" >> $record_file
            fi
        done < $record_file
        new_files=$(find . -type f -not -path './backup/*' -not -path './'$record_file -printf "%P\n")
        for file in $new_files; do
            cp -a $file $backup_dir
            current_modified=$(stat -c %Y $file)
            echo "$file\t$current_modified" >> $record_file
        done
    fi
}

# 恢复函数
function restore() {
    while read -r line; do
        file_path=$(echo $line | cut -f1)
        backup_file_path="$backup_dir/$file_path"
        if [ -f $backup_file_path ]; then
            cp -a $backup_file_path .
        fi
    done < $record_file
}

# 主程序
case "$1" in
    backup)
        incremental_backup
        ;;
    restore)
        restore
        ;;
    *)
        echo "Usage: $0 backup|restore"
        ;;
esac

上述脚本实现了以下功能:

  1. 增量备份:通过记录文件的修改时间,仅备份修改过的文件。首次备份时,会备份所有文件并记录其修改时间。后续备份时,比较当前文件的修改时间和记录文件中的时间,仅备份修改过的文件,并更新记录文件。
  2. 精确恢复:根据备份记录文件,将备份的文件恢复到原始位置,同时保留文件权限和链接。
  3. 文件权限和链接处理:使用cp -a命令,该命令会保留文件的所有属性,包括权限、所有者、时间戳等,并且会正确处理符号链接。

使用方法:

  • ./script.sh backup:执行增量备份。
  • ./script.sh restore:根据备份记录进行恢复。