能懒则懒,不想写代码了
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 文件,并赋予执行权限:
chmod +x 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 的格式命名快照。
记住,根据你的需求,你可能还需要在删除过期快照的部分进行相应的修改,以适应新的快照名称格式。
me
修改后删除过期快照要如何修改?
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相关命令拥有足够的权限,并根据实际路径配置脚本中的路径。
me
输出一个完整的脚本
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 文件,并赋予执行权限:
chmod +x btrfs_backup.sh
然后,你可以使用以下方式来调用脚本,指定最大备份天数、源目录和快照目录:
./btrfs_backup.sh 7 /path/to/src /path/to/snapshots
脚本会将源目录 /path/to/src 创建为只读的btrfs快照,并存储在 /path/to/snapshots 目录中。如果 /path/to/snapshots 目录不存在,脚本会自动创建它。脚本还会检查是否存在超过最大备份天数的快照,并删除最老的快照。
请注意,使用该脚本前,请确保你具有足够的权限执行btrfs相关命令,并对脚本中的路径进行正确配置。此外,根据实际需求,你可能需要根据日期格式进行调整和修改。