Como faço para gerar um regex para restaurar uma pasta específica para "restauração btrfs"?

Como faço para gerar um regex para restaurar uma pasta específica para "restauração btrfs"?

Estou tentando recuperar arquivos após uma falha no sistema de arquivos btrfs usando:

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

por exemplo, para recuperar todos os arquivos, /snapshots/@_2018-06-01T23:29:33-04:00.preupgrade/tentei seguirhttp://www.kossboss.com/?p=2277e consegui (entre muitas outras tentativas):

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

Não foi possível selecionar nenhum arquivo. Eu tentei 5 horas de coisas. Eu estou perdido.

O que estou fazendo de errado? Como posso fazer isso funcionar?

Precisa ser seletivo por uma série de razões. Principalmente porque ele falha no meio e preciso criar scripts de tentativas seletivas para recuperar arquivos viáveis ​​além das falhas.

Responder1

btrfs restoreverifica o sistema de arquivos começando na raiz e compara cada entrada com o regex. Se o caminho corresponder ao regex e for um diretório, ele verificará esse diretório. Se for um arquivo e corresponder, ele será restaurado.

O que isso significa é que cada diretório pai do arquivo/diretório que você está tentando restaurar precisa ser correspondido pela regex para garantir que o programa de restauração eventualmente chegue até ele.

O que o exemplo de regex da página de manual ^/(|home(|/username(|/Desktop(|/.*))))$realmente significa é " /seguido por nada ou homeseguido por nada ou /usernameseguido por nada ou /Desktopseguido por nada ou /.*", que é equivalente a "/ ou /home ou /home/username ou /home/username/ Desktop ou /home/nomedeusuário/Desktop/.*".

A construção incomum (|/foo)não corresponde a nada ou /fooe os grupos de captura aninhados servem apenas para poder aninhar as instruções ou.

Para facilitar a leitura, sugiro escrever a regex como ^(/|/home|/home/username|/home/username/Desktop/|/home/username/Desktop/.*)$, o que considero muito mais claro sobre o que está fazendo.

Responder2

OK. Eu poderia ter descoberto. De qualquer maneira, consegui que funcionasse. Os dois pontos e os travessões não eram evitáveis ​​e NÃO são regex normais. Para os dois pontos, travessões e outros, consegui simplesmente combinar "."

Seguindo as instruções da página de manual, incluídas abaixo para maior clareza, consegui o seguinte:

# 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/

Isso ainda deixa a questão do que está acontecendo com o formato regex?

na página de manual: --path-regex restaura apenas nomes de arquivos que correspondem a uma expressão regular (regex(7)) com um formato obrigatório

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

O formato não é muito confortável e restaura todos os arquivos nos diretórios em todo o caminho, portanto, isso não é útil para restaurar um único arquivo em uma hierarquia profunda.

informação relacionada