Как создать регулярное выражение для восстановления определенной папки для «btrfs restore»?

Как создать регулярное выражение для восстановления определенной папки для «btrfs restore»?

Я пытаюсь восстановить файлы после сбоя файловой системы btrfs с помощью:

btrfs restore --path-regex 'regex' -sv -D /dev/sdXX /mnt/destination

например, чтобы получить все файлы в /snapshots/@_2018-06-01T23:29:33-04:00.preupgrade/я попробовал следующееhttp://www.kossboss.com/?p=2277и получил (среди многих других попыток):

^/(|/snapshots(|/\@\_2018\-06\-01T23\:29\:33\-04\:00\.preupgrade(|/.*)))$

Не удалось выбрать ни одного файла. Я пробовал 5 часов. Я в растерянности.

Что я делаю не так? Как мне заставить это работать?

Он должен быть избирательным по ряду причин. Главным образом потому, что он дает сбой в середине, и мне нужно написать скрипт для избирательных попыток извлечения жизнеспособных файлов за пределами сбоев.

решение1

btrfs restoreсканирует файловую систему, начиная с корня, и сравнивает каждую запись с регулярным выражением. Если путь соответствует регулярному выражению и это каталог, он сканирует этот каталог. Если это файл и он соответствует, он его восстанавливает.

Это означает, что каждый родительский каталог файла/каталога, который вы пытаетесь восстановить, должен соответствовать регулярному выражению, чтобы гарантировать, что программа восстановления в конечном итоге доберется до него.

На самом деле пример регулярного выражения со страницы руководства ^/(|home(|/username(|/Desktop(|/.*))))$означает: « /за которым ничего не следует или homeза которым ничего не следует или /usernameза которым ничего не следует или /Desktopза которым ничего не следует или /.*», что эквивалентно «/ или /home или /home/username или /home/username/Desktop или /home/username/Desktop/.*».

Необычная (|/foo)конструкция не соответствует ничему или /fooвложенные группы захвата нужны только для того, чтобы можно было вкладывать операторы or.

Для удобства чтения я бы предложил записать регулярное выражение как ^(/|/home|/home/username|/home/username/Desktop/|/home/username/Desktop/.*)$, что, по-моему, гораздо яснее показывает, что оно делает.

решение2

Ладно. Я, возможно, разобрался. В любом случае, заставил это работать. Двоеточия и тире не экранировались, и это НЕ обычные регулярные выражения. Для двоеточий и тире и т. п. я ​​смог просто сопоставить "."

Следуя инструкциям с man-страницы, приведенным ниже для ясности, я получил следующее:

# restore specific path:
# "@_2018-08-17_08.18.30.preupgrade"
btrfs restore --path-regex   \
'^/(|snapshots(|/@\_2018.*08.17.*preupgrade(|/.*)))$'  \
-s  -o  /dev/sda5 /media/outputdir/

Остается вопрос: что происходит с форматом регулярных выражений?

из страницы руководства: --path-regex восстановить только имена файлов, соответствующие регулярному выражению (regex(7)) с обязательным форматом

       ^/(|home(|/username(|/Desktop(|/.*))))$

Формат не очень удобен и восстанавливает все файлы в каталогах по всему пути, поэтому он не пригоден для восстановления отдельного файла в глубокой иерархии.

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