Как мне сгенерировать регулярное выражение для восстановления определенной папки для "восстановления 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(|/.*))))$

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

Другие вопросы по тегам