面试题答案
一键面试#!/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
上述脚本实现了以下功能:
- 增量备份:通过记录文件的修改时间,仅备份修改过的文件。首次备份时,会备份所有文件并记录其修改时间。后续备份时,比较当前文件的修改时间和记录文件中的时间,仅备份修改过的文件,并更新记录文件。
- 精确恢复:根据备份记录文件,将备份的文件恢复到原始位置,同时保留文件权限和链接。
- 文件权限和链接处理:使用
cp -a
命令,该命令会保留文件的所有属性,包括权限、所有者、时间戳等,并且会正确处理符号链接。
使用方法:
./script.sh backup
:执行增量备份。./script.sh restore
:根据备份记录进行恢复。