Я пытаюсь восстановить файлы после сбоя файловой системы 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 часов вещей. Я в недоумении.
Что я делаю не так? Как заставить его работать?
Он должен быть избирательным по ряду причин. По-мужски, потому что он терпит неудачу в середине, и мне нужно сценарий выборочных попыток для получения жизнеспособных файлов после неудач.
btrfs restore
просматривает файловую систему, начиная с корня, и сравнивает каждую запись с регулярным выражением. Если путь соответствует регулярному выражению, и это каталог, он просканирует этот каталог. Если это файл и он соответствует, он восстановит его.
Это означает, что каждый родительский каталог файла / каталога, который вы пытаетесь восстановить, должен соответствовать регулярному выражению, чтобы гарантировать, что программа восстановления в конечном итоге доберется до него.
Какой образец регулярного выражения из справочной страницы ^/(|home(|/username(|/Desktop(|/.*))))$
на самом деле означает "/
за которым ничего не следует или home
за которым ничего не следует или /username
за которым ничего не следует или /Desktop
за которым ничего не следует или /.*
", что эквивалентно" / или / home или / home / username или / home / username / Desktop или /home/username/Desktop/.* ".
Необычный (|/foo)
конструкция ничего не соответствует или /foo
а вложенные группы захвата предназначены только для того, чтобы иметь возможность вкладывать операторы или.
Для удобства чтения я бы предложил написать регулярное выражение как ^(/|/home|/home/username|/home/username/Desktop/|/home/username/Desktop/.*)$
, что, я думаю, намного яснее в отношении того, что он делает.
Хорошо. Я мог бы понять это. В любом случае, он заработал. Двоеточия и тире нельзя было экранировать, и это НЕ обычное регулярное выражение. Для двоеточий, тире и т.п. я смог просто сопоставить "."
Следуя инструкциям на странице руководства, приведенной ниже для ясности, я получил следующее:
# 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(|/.*))))$
Формат не очень удобен и восстанавливает все файлы в каталогах по всему пути, поэтому он бесполезен для восстановления одного файла в глубокой иерархии.