Linux定时备份

来自MediaWiki
跳转到导航 跳转到搜索
#!/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"