Linux定时备份
跳转到导航
跳转到搜索
#!/bin/bash
# 参数设定
# WebDAV 服务器的 URL 和认证信息
webdav_url="https://file.raf.cc/dav/onedrive/backup/raf.cc"
webdav_user="admin"
webdav_pass="ksqqlsx1073"
# 备份存放的目录
basedir=/data/backup
# 要保留的最大天数
max_days=30
# 需要备份的目录或文件 使用空格分开
bakfiles="/data/docker/"
# 获取当前日期的时间戳
current_time=$(date +%s)
# 指定备份文件的名称,精确到秒
backup_file="backup_$(date +%Y%m%d)_$current_time.tgz"
echo =====================================================
date '+%D %T'
cd $basedir
# 删除备份目录中 $days 天以前备份文件,不包含子目录
find -maxdepth 1 -name "*.tgz" -mtime +"$max_days" -exec rm -f {} \;
# 创建一个新的备份文件,并将所有需要备份的目录和文件都添加到其中
tar -czpf "$basedir/$backup_file" $bakfiles
# 大文件打包前后,缓解磁盘压力,降低I/O错误概率
sleep 2s ;sync;sync
echo "Backup completed: $backup_file"
# 列出 WebDAV 目录中的所有文件
file_list=$(curl -s -u "$webdav_user:$webdav_pass" -X PROPFIND "$webdav_url" | grep -oP '<D:displayname>\K[^<]+' | sed '1d')
# 循环遍历文件列表
for file in $file_list; do
echo "checking file:$file"
# 获取文件的修改日期
modified_timestamp=$(echo $file|awk -F'[_.]' '{print $3}')
echo "modified_timestamp=$modified_timestamp"
# 计算文件存在的天数
days_diff=$(( (current_time - modified_timestamp) / 86400 ))
echo "days_diff=$days_diff"
# 如果文件存在的天数超过最大天数,就删除文件
if [ "$days_diff" -gt "$max_days" ]; then
echo "Deleting $file (modified on $modified_time)"
curl -u "$webdav_user:$webdav_pass" -X DELETE "$webdav_url/$file"
fi
done
echo "$(date '+%D %T'): start upload..."
curl -# -u "$webdav_user:$webdav_pass" -T $backup_file "$webdav_url/$backup_file"
echo "$(date '+%D %T'): Upload completed: $backup_file"