Estoy intentando recuperar archivos después de una falla de un sistema de archivos btrfs usando:
btrfs restore --path-regex 'regex' -sv -D /dev/sdXX /mnt/destination
por ejemplo, para recuperar todos los archivos /snapshots/@_2018-06-01T23:29:33-04:00.preupgrade/
intenté seguirhttp://www.kossboss.com/?p=2277y obtuve (entre muchos otros intentos):
^/(|/snapshots(|/\@\_2018\-06\-01T23\:29\:33\-04\:00\.preupgrade(|/.*)))$
Esto no pudo seleccionar ningún archivo. He probado 5 horas de cosas. Estoy en una pérdida.
¿Qué estoy haciendo mal? ¿Cómo puedo hacerlo funcionar?
Debe ser selectivo por varias razones. Manly porque falla en el medio y necesito programar intentos selectivos para recuperar archivos viables más allá de los fallos.
Respuesta1
btrfs restore
escanea el sistema de archivos comenzando en la raíz y compara cada entrada con la expresión regular. Si la ruta coincide con la expresión regular y es un directorio, escaneará ese directorio. Si es un archivo y coincide, lo restaurará.
Lo que esto significa es que cada directorio principal del archivo/directorio que está intentando restaurar debe coincidir con la expresión regular para garantizar que el programa de restauración finalmente llegue a él.
Lo que realmente significa la expresión regular de muestra de la página de manual ^/(|home(|/username(|/Desktop(|/.*))))$
es " /
seguido de nada o home
seguido de nada o /username
seguido de nada o /Desktop
seguido de nada o /.*
", que equivale a "/ o /home o /home/nombre de usuario o /home/nombre de usuario/ Escritorio o /home/nombre de usuario/Desktop/.*".
La construcción inusual (|/foo)
no coincide con nada o /foo
y los grupos de captura anidados son solo para poder anidar las declaraciones o.
En aras de la legibilidad, sugeriría escribir la expresión regular como ^(/|/home|/home/username|/home/username/Desktop/|/home/username/Desktop/.*)$
, que creo que es mucho más claro en cuanto a lo que hace.
Respuesta2
De acuerdo. Quizás lo haya descubierto. Lo hice funcionar de todos modos. Los dos puntos y los guiones no eran evitables y NO son expresiones regulares normales. Para los dos puntos, los guiones y demás, pude simplemente hacer coincidir "."
Siguiendo las instrucciones de la página de manual, incluidas a continuación para mayor claridad, obtuve esto:
# 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/
Esto todavía deja la pregunta de ¿qué está pasando con el formato regex?
desde la página de manual: --path-regex restaura solo nombres de archivos que coincidan con una expresión regular (regex(7)) con un formato obligatorio
^/(|home(|/username(|/Desktop(|/.*))))$
El formato no es muy cómodo y restaura todos los archivos en los directorios en la ruta completa, por lo que esto no es útil para restaurar un solo archivo en una jerarquía profunda.