Проверить, существует ли подтом 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" (т. е. первая ошибка выходит из моей оболочки. Помните, что я должен запустить ее как 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

Связанный контент