Как мне сгенерировать регулярное выражение для восстановления определенной папки для «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
задан 30 August 2018 в 16:58
2 ответа

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

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

# 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(|/.*))))$

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

0
ответ дан 4 December 2019 в 03:42

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

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

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

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

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

0
ответ дан 4 December 2019 в 03:42

Теги

Похожие вопросы