¿Cómo genero una expresión regular para restaurar una carpeta específica para "restaurar btrfs"?

¿Cómo genero una expresión regular para restaurar una carpeta específica para "restaurar btrfs"?

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 restoreescanea 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 homeseguido de nada o /usernameseguido de nada o /Desktopseguido 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 /fooy 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.

información relacionada