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