能懒则懒,不想写代码了
me
在 bash 环境下,创建一个 btrfs 快照功能的备份脚本 btrfs_backup.sh, 使用的方式为: btrfs_backup.sh day src dest; day 表示最大的备份天数, src 表示 btrfs 的源目录, dest 表示 snapshots 的目录, 如果 snapshots 目录不存在,则创建它, 每个快照均以 day-%d 的格式存放,如果快照超过了传入的最大备份参数,则删除最老的快照
ChatGPT
下面是一个示例的 bash 脚本 btrfs_backup.sh,实现了创建 btrfs 快照的备份功能:
#!/bin/bash
# 获取输入参数
day=$1
src=$2
dest=$3
# 检查snapshots目录是否存在,如果不存在则创建它
if [[ ! -d "$dest" ]]; then
mkdir -p "$dest"
fi
# 创建当前日期的快照
snapshot_name="day-$(date +'%d')"
btrfs subvolume snapshot -r "$src" "$dest/$snapshot_name"
# 删除超过最大备份天数的快照
snapshots=("$dest"/day-*)
num_snapshots=${#snapshots[@]}
if [[ $num_snapshots -gt $day ]]; then
num_to_delete=$((num_snapshots - day))
for ((i=0; i < num_to_delete; i++)); do
oldest_snapshot="${snapshots[$i]}"
btrfs subvolume delete "$oldest_snapshot"
done
fi
你可以将上述脚本保存为 btrfs_backup.sh 文件,并赋予执行权限:
然后,你可以使用以下方式来调用脚本,指定最大备份天数、源目录和快照目录:
./btrfs_backup.sh 7 /path/to/src /path/to/snapshots
上述示例中,脚本会将源目录 /path/to/src 创建为只读的 btrfs 快照,并存储在 /path/to/snapshots 目录中。如果 /path/to/snapshots 目录不存在,脚本会自动创建它。同时,脚本会检查是否存在超过最大备份天数的快照,并删除最老的快照。
请注意,使用该脚本前,请确保你具有足够的权限执行 btrfs 相关命令,并对脚本中的路径进行正确配置。此外,该脚本仅提供了一个基本的备份功能示例,你可以根据实际需求进行修改和扩展。
me
snapshot_name 应该是 yyyy-mm-dd 的格式
ChatGPT
如果你想要以 yyyy-mm-dd 的格式命名快照,可以按照以下方式修改脚本中的 snapshot_name 部分:
# 创建当前日期的快照
snapshot_name=$(date +'%Y-%m-%d')
btrfs subvolume snapshot -r "$src" "$dest/$snapshot_name"
在上述示例中,使用 $(date +’%Y-%m-%d’) 获取当前日期,并将其作为快照的名称。这样就会按照 yyyy-mm-dd 的格式命名快照。
记住,根据你的需求,你可能还需要在删除过期快照的部分进行相应的修改,以适应新的快照名称格式。
ChatGPT
如果要根据新的快照名称格式 yyyy-mm-dd 删除过期的快照,你可以按照以下方式修改删除过期快照的部分:
# 删除超过最大备份天数的快照
snapshots=("$dest"/*)
num_snapshots=${#snapshots[@]}
if [[ $num_snapshots -gt $day ]]; then
num_to_delete=$((num_snapshots - day))
for ((i=0; i < num_to_delete; i++)); do
oldest_snapshot="${snapshots[$i]}"
oldest_snapshot_date=$(basename "$oldest_snapshot")
oldest_snapshot_date=${oldest_snapshot_date#"day-"} # 移除前缀 "day-"
# 检查快照日期是否超过最大备份天数
snapshot_date=$(date -d "$oldest_snapshot_date" +%s)
max_date=$(date -d "-$day days" +%s)
if [[ $snapshot_date -lt $max_date ]]; then
btrfs subvolume delete "$oldest_snapshot"
fi
done
fi
在上述示例中,我们将快照名称中的日期部分提取出来,并将其转换为 Unix 时间戳,以便进行比较。然后,我们计算最大备份日期(即当前日期减去最大备份天数),并将其转换为 Unix 时间戳。最后,我们比较快照日期和最大备份日期,并根据需要删除过期的快照。
请注意,上述示例假定快照名称的日期部分是符合 yyyy-mm-dd 格式的。如果你的日期格式有所不同,你需要相应地调整 oldest_snapshot_date 和日期格式化的部分。
通过以上修改,你应该可以根据新的快照名称格式删除过期的快照。记得在使用脚本之前,确保对 btrfs 相关命令拥有足够的权限,并根据实际路径配置脚本中的路径。
ChatGPT
以下是修改后的完整脚本 btrfs_backup.sh,实现了按照 yyyy-mm-dd 格式创建和删除过期快照的功能:
#!/bin/bash
# 获取输入参数
day=$1
src=$2
dest=$3
# 检查snapshots目录是否存在,如果不存在则创建它
if [[ ! -d "$dest" ]]; then
mkdir -p "$dest"
fi
# 创建当前日期的快照
snapshot_name=$(date +'%Y-%m-%d')
btrfs subvolume snapshot -r "$src" "$dest/$snapshot_name"
# 删除超过最大备份天数的快照
snapshots=("$dest"/*)
num_snapshots=${#snapshots[@]}
if [[ $num_snapshots -gt $day ]]; then
num_to_delete=$((num_snapshots - day))
for ((i=0; i < num_to_delete; i++)); do
oldest_snapshot="${snapshots[$i]}"
oldest_snapshot_date=$(basename "$oldest_snapshot")
oldest_snapshot_date=${oldest_snapshot_date#"day-"} # 移除前缀 "day-"
# 检查快照日期是否超过最大备份天数
snapshot_date=$(date -d "$oldest_snapshot_date" +%s)
max_date=$(date -d "-$day days" +%s)
if [[ $snapshot_date -lt $max_date ]]; then
btrfs subvolume delete "$oldest_snapshot"
fi
done
fi
你可以将上述脚本保存为 btrfs_backup.sh 文件,并赋予执行权限:
然后,你可以使用以下方式来调用脚本,指定最大备份天数、源目录和快照目录:
./btrfs_backup.sh 7 /path/to/src /path/to/snapshots
脚本会将源目录 /path/to/src 创建为只读的 btrfs 快照,并存储在 /path/to/snapshots 目录中。如果 /path/to/snapshots 目录不存在,脚本会自动创建它。脚本还会检查是否存在超过最大备份天数的快照,并删除最老的快照。
请注意,使用该脚本前,请确保你具有足够的权限执行 btrfs 相关命令,并对脚本中的路径进行正确配置。此外,根据实际需求,你可能需要根据日期格式进行调整和修改。