Teste se o subvolume btrfs existe

Teste se o subvolume btrfs existe

Eu tenho um problema em um procedimento bash, que deve portar meu antigo backup de disco rsync (e arquivo) para meu futuro backup de instantâneo btrfs.

Eu quero usar a linha:

 # btrfs subvolume snapshot /targetdir/@monthly.9 /targetdir/@monthly.8

Se o instantâneo /targetdir/@monthly.8 não existir, ele será criado, como eu quero.

Mas se /targetdir/@monthly.8 já estava lá, então /targetdir/@monthly.8/@onthly.9 será criado.

Estou faltando aqui um teste de existência, diga:

# [[ -bsnap <snap-path> ]] # =TRUE if <snap-path> exists and is a snap!

Como posso superar esse problema?

Responder1

Eu acho que você não quer executar btrfs subvolume snapshot …se /targetdir/@monthly.8existir, independentemente do que seja. Basta testar se existe:

[ -e /targetdir/@monthly.8 ]

ou não existe

[ ! -e /targetdir/@monthly.8 ]

o que for mais útil. Se existe quando não deveria, então btrfs subvolume deleteexiste. Somente se este comando retornar ERROR: not a subvolumevocê se preocupará com o que mais é o objeto. Aconselho você a organizar seu fluxo de trabalho, subvolumes, pontos de montagem, diretórios e suas permissões de uma forma que @monthly.8só poderia ser um subvolume.


Mas se você realmente precisa saber

btrfs subvolume show /targetdir/@monthly.8

terá sucesso se for um subvolume; caso contrário, falhará. Exemplo:

btrfs subvolume show /targetdir/@monthly.8 &>/dev/null && echo "It's a subvolume!"

Responder2

A resposta de @Kamil Maciorowski é boa. Mas deixe-me concentrar-me no teste de existência.

Digamos que estou depurando e preciso repetir uma tentativa e o instantâneo de destino já estava lá. Então fui muito cauteloso e coloquei "bash -e" (ou seja, o primeiro erro sai do meu shell. Lembre-se que devo executá-lo como root...). Então prefiro um comando que me diga o que aconteceu e depois saia. Portanto eu faço:

    btrfs subvolume list  /targetdir/@monthly.9 | grep @monthly.8 &&  echo "$0 ERROR: snapshot /targetdir/@monthly.8 exists already!" && exit

O comando "lista de subvolumes" não apresenta erros e lista todos eles. Aí eu filtro conforme preciso e tomo minhas decisões.

Responder3

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

informação relacionada