У меня проблема в процедуре 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!

Как я могу преодолеть эту проблему?

2 ответа2

0

Ответ @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" не выдает ошибок и перечисляет их все. Затем я фильтрую по мере необходимости и принимаю решения.

0

Я полагаю, что вы не хотите запускать btrfs subvolume btrfs subvolume snapshot … если существует /targetdir/@monthly.8 , независимо от того, что это такое. Просто проверьте, существует ли он:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .