1panel 脚本

安装 rsync

1
2
3
docker exec -it 1panel bash # 进入 1panel 容器

sudo apt-get update && sudo apt-get install rsync -y # 安装 rsync

目录同步脚本

  • /ahost/vol1/1000/home/目录下的文件同步到 /ahost/vol2/1000/backup/home-bak/ 目录下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/bin/bash

## 获取开始时间
start_time=$(date '+%Y-%m-%d %H:%M:%S')
start_timestamp=$(date +%s)
echo "同步开始时间:$start_time"

## 检查是否安装了rsync
if ! command -v rsync &> /dev/null; then
echo "rsync未安装,正在尝试安装..."
sudo apt-get update
if sudo apt-get install -y rsync; then
echo "rsync安装成功"
else
echo "rsync安装失败,请手动安装后再试" >&2
exit 1
fi
else
echo "rsync已安装,无需重新安装"
fi

##---------------------- 你要修改的地方 ----------------------##
## 定义源目录
source_dir="/ahost/vol1/1000/home/"

## 定义目标目录数组
target_dirs=(
"/ahost/vol2/1000/backup/home-bak/"
# 在这里添加更多的目标目录
)
##---------------------- 你要修改的地方 ----------------------##

## 函数用于同步目录并计算传输完成度
sync_and_check() {
local source_dir=$1
local target_dir=$2
local dir_name=$3

## 检查目标目录是否存在,若不存在则创建
if [ ! -d "$target_dir" ]; then
echo "目标目录 $target_dir 不存在,正在创建..."
mkdir -p "$target_dir"
if [ $? -ne 0 ]; then
echo "创建目标目录失败,请检查权限。" >&2
return 1
fi
fi

## 执行同步操作
rsync -avhzp --progress --delete "$source_dir" "$target_dir" 2>&1
local rsync_status=$?

## 计算源目录和目标目录的文件大小
local source_size=$(du -sb "$source_dir" | cut -f1)
local target_size=$(du -sb "$target_dir" | cut -f1)

## 计算传输完成度
local completion
if [ "$target_size" -gt 0 ] && [ "$source_size" -gt 0 ]; then
completion=$(awk "BEGIN {printf \"%.2f\", ($target_size / $source_size) * 100}")
else
completion="0.00"
fi

## 输出结果
if [ $rsync_status -eq 0 ]; then
echo "同步操作成功完成($dir_name):"
echo "- 传输完成度: ${completion}%"
else
echo "同步失败($dir_name),请检查日志以获取更多信息。"
fi
}

## 循环遍历所有目标目录并同步
for index in "${!target_dirs[@]}"; do
target_dir="${target_dirs[$index]}"
dir_name="路径$((index + 1))"
sync_and_check "$source_dir" "$target_dir" "$dir_name"
done

echo "--------------------------------"
echo "同步开始时间:$start_time"
echo "--------------------------------"
## 获取结束时间
end_time=$(date '+%Y-%m-%d %H:%M:%S')
end_timestamp=$(date +%s)
echo "同步结束时间:$end_time"
echo "--------------------------------"
## 计算总用时
total_time=$((end_timestamp - start_timestamp))
echo "执行脚本用时:$total_time 秒"
echo "--------------------------------"
echo "源目录路径 :$source_dir"
echo "目标目录列表:"
printf ' %s\n' "${target_dirs[@]}"

压缩目录

/ahost/vol1/1000/home 压缩为 home_yyyymmdd.tar.gz保存到 /ahost/vol2/1000/backup目录下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/bin/bash

## 获取开始时间
start_time=$(date '+%Y-%m-%d %H:%M:%S')
start_timestamp=$(date +%s)
echo "同步开始时间:$start_time"

##---------------------- 你要修改的地方 ----------------------##
## 定义源目录和目标目录
## 源目录
source_dir="/ahost/vol1/1000/home"
## 目标目录
target_dir="/ahost/vol2/1000/backup"
## 将源目录 压缩到 目标目录下
##------------------------------------------------------------##

## 确保目标目录存在
mkdir -p "$target_dir"

## 获取当前日期
current_date=$(date +"%Y%m%d%H%M")

## 压缩 source_dir 源目标目录
tar -czvf "${target_dir}/home_${current_date}.tar.gz" "$source_dir"

##---------------------- 你要修改的地方 ----------------------##
## 删除旧的备份文件,+3 为保留两个,+4 为保留最近三个
cd "$target_dir"
ls -t home_*.tar.gz | tail -n +4 | xargs rm -f
##------------------------------------------------------------##

echo "--------------------------------"
echo "同步开始时间:$start_time"
echo "--------------------------------"
## 获取结束时间
end_time=$(date '+%Y-%m-%d %H:%M:%S')
end_timestamp=$(date +%s)
echo "同步结束时间:$end_time"
echo "--------------------------------"
## 计算总用时
total_time=$((end_timestamp - start_timestamp))
echo "执行脚本用时:$total_time 秒"
echo "--------------------------------"
## 查看压缩后文件大小
compressed_file="${target_dir}/home_${current_date}.tar.gz"
file_size=$(du -h "$compressed_file" | awk '{print $1}')
echo "压缩文件大小:$file_size"
echo "--------------------------------"
echo "源目录路径 :$source_dir"
echo "目标目录列表:$target_dir"
## echo "目标目录列表:"
## printf ' %s\n' "${target_dirs[@]}"
echo "--------------------------------"