Wie generiere ich einen regulären Ausdruck zum Wiederherstellen eines bestimmten Ordners für „btrfs restore“?

Wie generiere ich einen regulären Ausdruck zum Wiederherstellen eines bestimmten Ordners für „btrfs restore“?

Ich versuche, Dateien nach einem Absturz eines BTRFS-Dateisystems wiederherzustellen, und zwar mit:

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

zum Beispiel, um alle Dateien abzurufen, /snapshots/@_2018-06-01T23:29:33-04:00.preupgrade/habe ich versucht, folgendehttp://www.kossboss.com/?p=2277und bekam (neben vielen anderen Versuchen):

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

Es konnten keine Dateien ausgewählt werden. Ich habe 5 Stunden lang alles mögliche probiert. Ich bin ratlos.

Was mache ich falsch? Wie kann ich es zum Laufen bringen?

Es muss aus mehreren Gründen selektiv sein. Hauptsächlich, weil es mittendrin fehlschlägt und ich selektive Versuche skripten muss, um nach den Fehlschlägen noch brauchbare Dateien abzurufen.

Antwort1

btrfs restoredurchsucht das Dateisystem beginnend bei der Wurzel und vergleicht jeden Eintrag mit dem regulären Ausdruck. Wenn der Pfad mit dem regulären Ausdruck übereinstimmt und es sich um ein Verzeichnis handelt, wird dieses Verzeichnis durchsucht. Wenn es sich um eine Datei handelt und der Eintrag übereinstimmt, wird sie wiederhergestellt.

Das bedeutet, dass jedes übergeordnete Verzeichnis der Datei/des Verzeichnisses, das/die Sie wiederherstellen möchten, mit dem regulären Ausdruck übereinstimmen muss, um sicherzustellen, dass das Wiederherstellungsprogramm es schließlich findet.

Was der Beispiel-Regex aus der Manpage ^/(|home(|/username(|/Desktop(|/.*))))$wirklich bedeutet, ist „ /gefolgt von nichts oder homegefolgt von nichts oder /usernamegefolgt von nichts oder /Desktopgefolgt von nichts oder /.*“, was gleichbedeutend ist mit „/ oder /home oder /home/Benutzername oder /home/Benutzername/Desktop oder /home/Benutzername/Desktop/.*“.

Die ungewöhnliche (|/foo)Konstruktion passt nichts an oder /foound die verschachtelten Erfassungsgruppen dienen nur dazu, die oder Anweisungen verschachteln zu können.

Der Lesbarkeit halber würde ich vorschlagen, den regulären Ausdruck so zu schreiben ^(/|/home|/home/username|/home/username/Desktop/|/home/username/Desktop/.*)$. Meiner Meinung nach ist dadurch viel klarer, was er bewirkt.

Antwort2

Ok. Ich habe es vielleicht herausgefunden. Habe es trotzdem zum Laufen gebracht. Die Doppelpunkte und Bindestriche konnten nicht ausgeblendet werden und das sind KEINE normalen regulären Ausdrücke. Für die Doppelpunkte und Bindestriche und so konnte ich einfach "." abgleichen.

Ich habe die Anweisungen auf der Manpage befolgt (die der Übersichtlichkeit halber unten aufgeführt sind), und habe Folgendes erhalten:

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

Es bleibt immer noch die Frage, was mit dem Regex-Format los ist.

aus der Manpage: --path-regex stellt nur Dateinamen wieder her, die einem regulären Ausdruck (regex(7)) mit einem obligatorischen Format entsprechen

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

Das Format ist nicht sehr komfortabel und stellt alle Dateien in den Verzeichnissen im gesamten Pfad wieder her. Es ist daher nicht geeignet, um einzelne Dateien in einer tiefen Hierarchie wiederherzustellen.

verwandte Informationen