测试 btrfs 子卷是否存在

测试 btrfs 子卷是否存在

我在 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.8exist ,不管它是什么。只需测试它是否存在:

[ -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

相关内容