我在 bash 程序中遇到了问题,该程序应该将我的旧 rsync 磁盘备份(和存档)移植到我未来的 btrfs 快照备份中。
我想要使用以下行:
# btrfs subvolume snapshot /targetdir/@monthly.9 /targetdir/@monthly.8
如果快照 /targetdir/@monthly.8 不存在,那么就会创建它,正如我希望的那样。
但是如果 /targetdir/@monthly.8 已经存在,那么将创建 /targetdir/@monthly.8/@onthly.9。
我这里缺少一个存在性测试,比如说:
# [[ -bsnap <snap-path> ]] # =TRUE if <snap-path> exists and is a snap!
我该如何解决这个问题?
答案1
我猜你不想运行btrfs subvolume snapshot …
if /targetdir/@monthly.8
exist ,不管它是什么。只需测试它是否存在:
[ -e /targetdir/@monthly.8 ]
或不存在
[ ! -e /targetdir/@monthly.8 ]
无论哪个更有用。如果它存在但不应该存在,那么btrfs subvolume delete
它就存在。只有当此命令返回时才ERROR: not a subvolume
需要担心对象是什么。我建议您以只能是子卷的方式组织您的工作流程、子卷、挂载点、目录及其权限@monthly.8
。
但如果你真的想知道
btrfs subvolume show /targetdir/@monthly.8
如果是子卷,则会成功;否则会失败。例如:
btrfs subvolume show /targetdir/@monthly.8 &>/dev/null && echo "It's a subvolume!"
答案2
@Kamil Maciorowski 的回答很好。但让我集中讨论一下存在性测试。
假设我正在调试,我需要重复尝试,而目标快照已经存在。然后我非常谨慎,并输入“bash -e”(即第一个错误退出我的 shell。请记住,我必须以 root 身份运行它...)。然后我更喜欢一个告诉我发生了什么的命令,然后退出。因此我这样做:
btrfs subvolume list /targetdir/@monthly.9 | grep @monthly.8 && echo "$0 ERROR: snapshot /targetdir/@monthly.8 exists already!" && exit
命令“subvolume list”没有给出错误并列出所有。然后我根据需要进行过滤并做出决定。
答案3
function btrfsCreateSVIfNotExist ()
{
# parameters: $1 the dest/name of the subvolume (what you'd pass to btrfs subvolume create, e.g. /home/MYSUBVOLNAME)
# creates a btrfs subvolume under dest/ if it doesn't already exist
if ! btrfs subvolume show "$1" > /dev/null 2>&1; then
btrfs subvolume create "$1"
fi
}
export -f btrfsCreateSVIfNotExist