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 restore
verifica 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 home
seguido por nada ou /username
seguido por nada ou /Desktop
seguido 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 /foo
e 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.