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