Restic: Kann keine Dokumente für die Dateiausschlusssyntax finden

Erstellt am 8. Juni 2017  ·  17Kommentare  ·  Quelle: restic/restic

Ich kann anscheinend keine Dokumente finden, wie die Syntax der Ausschlussdatei analysiert wird.

dh unterstützt es Wildcards? Regex? Wie unterscheidet es zwischen Dateien und Verzeichnissen? werden Pfadpräfixe benötigt? woher (cwd/oder root?)?

Einige Beispiele:

.qiv-trash (directory that could be anywhere on the filesystem)
.DS_Store
lost+found/
._*
desktop.ini
Thumbs.db (file that could be anywhere on the filesystem)
.Trash-* (the asterisk could be any number, is it needed?)
.tmp$ (file ending in .tmp)
~$ (file ending in a tilde)
~/.cache/ (cache directory in user home dir, using tilde syntax)
/full/path/to/directory/.syncthing/index*
documentation wanted

Hilfreichster Kommentar

Um schon einige deiner Fragen zu beantworten:

  • Alle Muster werden gegen den vollständigen Pfad einer zu speichernden Datei/des Verzeichnisses getestet
  • Relative Pfade/Muster stimmen überall unterhalb des zu speichernden Pfads überein
  • Im Moment gibt es keine Möglichkeit, zwischen einer Datei und einem Verzeichnis zu unterscheiden, daher schließt --exclude foo alle Dateien und Verzeichnisse mit dem Namen foo . Das gleiche gilt für --exclude foo/ .

Aus Ihrer Ausschlussdatei:

  • ._* wird mit allen Dateien und Verzeichnissen übereinstimmen, deren Name mit einem Punkt und einem Unterstrich beginnt
  • desktop.ini desktop.ini genau mit allen Dateien mit dem Namen desktop.ini.bak wird also nicht ausgeschlossen und im Snapshot gespeichert.
  • .Trash-* schließt Dateien/Verzeichnisse mit den Namen .Trash- , .Trash-foobar usw. aus.
  • .tmp$ schließt alle Dateien/Verzeichnisse aus, die wörtlich .tmp$ , das ist ein Punkt, gefolgt von tmp , gefolgt von einem Dollarzeichen. Keine Regexp-Erweiterung.
  • ~$ schließt alle Dateien/Verzeichnisse aus, die wörtlich Tilde-Dollar heißen. Um alle Dateien/Verzeichnisse auszuschließen, die mit einer Tilde enden, verwenden Sie *~ .
  • ~/.cache schließt das Verzeichnis .cache in allen Verzeichnissen namens tilde aus. Um das Cache-Verzeichnis nur in Ihrem Home-Verzeichnis auszuschließen, verwenden Sie $HOME/.cache (Tilde wird nicht erweitert, Umgebungsvariablen sind, sondern nur in einer Datei, die über --exclude-file gelesen wird, in der Befehlszeile wird die Shell erweitert beide).
  • /full/path/to/directory/.syncthing/index* schließt alle Dinge aus, deren Namen mit index unter /full/path/to/directory/.syncthing .

Alle 17 Kommentare

Hallo, hast du gesehen?

Muster verwenden intern filepath.Glob, Syntax siehe filepath.Match. ** schließt zusätzlich beliebige Unterverzeichnisse aus. Umgebungsvariablen in Exclude-Dateien werden mit os.ExpandEnv erweitert.

in https://github.com/restic/restic/blob/master/doc/manual.rst?

Ich denke, das sollte deine Fragen beantworten.

Ich bin in die Dokumentation unter https://restic.readthedocs.io/en/latest/manual.html gegangen und habe nach ausschließen gesucht, wo es leider keine gängigen Beispiele enthält (oder einen Verweis auf die andere Dokumentation unter manual.rst .). ) :/

Ich habe das Golang-Dokument gelesen und ich denke, der Endbenutzer (ich!) wird nicht wissen, was restic einen Ausschluss mit intern vergleicht - ist es der vollständige Pfad (zB /home/me/blah) oder ein Pfad von der Repository-Root (/blah oder blah) oder relativ zum cwd (me/blah wenn ich in /home bin)?

Vielen Dank, dass Sie dieses Thema angesprochen haben, ich denke, Sie haben einen gültigen Punkt. Das Handbuch sollte die Ausschlussfilter erklären, ohne auf godoc.org zu verweisen, und es sind weitere Beispiele erforderlich.

Um schon einige deiner Fragen zu beantworten:

  • Alle Muster werden gegen den vollständigen Pfad einer zu speichernden Datei/des Verzeichnisses getestet
  • Relative Pfade/Muster stimmen überall unterhalb des zu speichernden Pfads überein
  • Im Moment gibt es keine Möglichkeit, zwischen einer Datei und einem Verzeichnis zu unterscheiden, daher schließt --exclude foo alle Dateien und Verzeichnisse mit dem Namen foo . Das gleiche gilt für --exclude foo/ .

Aus Ihrer Ausschlussdatei:

  • ._* wird mit allen Dateien und Verzeichnissen übereinstimmen, deren Name mit einem Punkt und einem Unterstrich beginnt
  • desktop.ini desktop.ini genau mit allen Dateien mit dem Namen desktop.ini.bak wird also nicht ausgeschlossen und im Snapshot gespeichert.
  • .Trash-* schließt Dateien/Verzeichnisse mit den Namen .Trash- , .Trash-foobar usw. aus.
  • .tmp$ schließt alle Dateien/Verzeichnisse aus, die wörtlich .tmp$ , das ist ein Punkt, gefolgt von tmp , gefolgt von einem Dollarzeichen. Keine Regexp-Erweiterung.
  • ~$ schließt alle Dateien/Verzeichnisse aus, die wörtlich Tilde-Dollar heißen. Um alle Dateien/Verzeichnisse auszuschließen, die mit einer Tilde enden, verwenden Sie *~ .
  • ~/.cache schließt das Verzeichnis .cache in allen Verzeichnissen namens tilde aus. Um das Cache-Verzeichnis nur in Ihrem Home-Verzeichnis auszuschließen, verwenden Sie $HOME/.cache (Tilde wird nicht erweitert, Umgebungsvariablen sind, sondern nur in einer Datei, die über --exclude-file gelesen wird, in der Befehlszeile wird die Shell erweitert beide).
  • /full/path/to/directory/.syncthing/index* schließt alle Dinge aus, deren Namen mit index unter /full/path/to/directory/.syncthing .

Danke @fd0

Mit "aktuelles Verzeichnis" meinen Sie also nicht das Verzeichnis, in dem ich mich befand, als ich das Backup gestartet habe, sondern das Verzeichnis, in dem sich derzeit die Dateien befinden (abgesehen von Ausschlüssen, die mit einem Schrägstrich beginnen). Ich habs.

Das Verhalten für Dateien und Verzeichnisse ist etwas unerwartet, ich hätte erwartet, dass --exclude foo/ das Verzeichnis, aber nicht den Inhalt sichert, während --exclude foo auch nicht sichert. Ich bin mir nicht sicher, warum, von rsync, denke ich.

Meinen Beispielen fehlte ein wichtiges: Leerzeichen! Ich denke, ich muss diese und Metazeichen mit einem Backslash umgehen.

Ich habe viele davon kopiert: https://gist.github.com/jult/e2eaedad6b9e29d95977fea0ddffae7d

Sind Kommentare in der Ausschlussdatei zulässig? Bearbeiten: https://github.com/restic/restic/pull/916/commits/c796d84fca48feea91ca3e85fbf38e16f764a468 sieht aus wie ein Hash ist das Kommentarzeichen.

Ah, ich fürchte, das ist immer noch nicht ganz richtig. Ich werde beschreiben, wie restic die Ausschlussmuster auswertet. Angenommen, restic wird von einem Benutzer in seinem Home-Verzeichnis ( /home/user ) wie folgt ausgeführt:

$ restic backup --exclude='*.bak' --exclude='/home/user/secret' --exclude='extra' ~

Dann sieht restic die folgenden Befehlszeilenargumente (nach der Erweiterung durch die Shell):

["restic", "backup", "--exclude='*.bak'", "--exclude='/home/user/secret'", "--exclude='extra'", "/home/user"]

Dann beginnt es, /home/user durchlaufen. Die folgende Liste beschreibt, was passiert, wenn die benannte Datei/das Verzeichnis angezeigt wird. restic testet immer den kompletten Pfad gegen die Muster:

  • file /home/user/foo.bak : Das Muster *.bak stimmt überein und die Datei wird nicht gespeichert. Das Muster ist nicht absolut, also passt es überall für alle Dateien, die auf .bak enden.
  • dir /home/user/secret : Das absolute Muster /home/user/secret stimmt überein, also wird das Verzeichnis nicht gespeichert und nicht durchlaufen
  • dir /home/user/foo/home/user/secret : Keine Musterübereinstimmungen, daher wird das Verzeichnis gespeichert.
  • dir /home/user/work/extra : Das Muster extra stimmt überein, das Verzeichnis wird nicht gespeichert.

Ich hoffe, dass dies jetzt etwas klarer ist, ich werde dem Handbuch einen Abschnitt hinzufügen, der den Vorgang beschreibt. Der wichtigste Punkt ist, dass die Muster während des Backups anhand des vollständigen Pfads der Dateien bewertet werden. Wenn Sie also ein einzelnes Verzeichnis abgleichen möchten, verwenden Sie den vollständigen Pfad, da er sonst irgendwo mehrmals übereinstimmen kann.

Gibt es noch Fragen? :)

Ich habe weitere Fragen und schätze es sehr, dass Sie sich die Zeit nehmen, diese zu beantworten. Es ist wirklich eine Frage zur automagischen Verankerung von Mustern. Ich denke, ich kann die Antwort erraten (wir verlassen uns darauf, dass der absolute Pfad ziemlich einzigartig ist und uns das gewünschte Verhalten gibt), aber es ist am besten, zu fragen und sicher zu sein.

Würde das absolute Muster /home/user/secret mit /home/user/secret2 übereinstimmen? (Was ist, wenn Sie es nicht wollen?)
Würde das absolute Muster /home/user/secret mit /home/user/somemount/home/user/secret übereinstimmen?

In beiden Fällen: Nein, das Muster wird nicht übereinstimmen.

Warum ist das so? Edit: Ich bin froh, dass es nicht so ist, aber ich verstehe nicht, warum das so ist :)

Der passende Code dort ist nach dem modelliert, was eine Shell tun würde: Wenn Sie sich fragen würden, ob die Datei /home/user/secret2 existiert, was würde ls /home/user/secret drucken (vorausgesetzt, die Datei secret ist nicht vorhanden)?

Formaler ausgedrückt: Wenn das Muster mit einem / beginnt, ist es absolut und das Muster muss am Anfang des zu testenden Strings übereinstimmen, also stimmt das Muster /home/user/secret nicht mit /home/user/somemount[...] überein.

Sie können sich vorstellen, dass sowohl das Muster als auch der Dateipfad in ihre jeweiligen Komponenten aufgeteilt sind:

  • /home/user/secret wird in [ROOT, "home", "user", "secret"] und die Datei /home/user/somemount/home/user/secret wird in [ROOT, "home", "user", "somemount", "home", "user", "secret"] . Die Zeichenfolge ROOT wird in diesem Beispiel verwendet, um das Root-Verzeichnis zu markieren. Sie sehen, dass das Muster nicht im Dateinamen enthalten ist.

    • Schauen wir uns die Datei /home/user/secret2 , die in [ROOT, "home", "user", "secret2"] . Auch hier sehen Sie, dass das Muster nicht im Dateinamen enthalten ist.

  • Bei der Datei /home/user/secret/secret.txt , die in [ROOT, "home", "user", "secret", "secret.txt"] , sieht man gleich am Anfang, dass das Muster tatsächlich im Dateinamen enthalten ist: [ROOT, "home", "user", "secret", ...] , also stimmt das Muster überein und die Datei wird ausgeschlossen.
  • Nehmen wir an, wir haben ein relatives Ausschlussmuster von secret/secret.txt , das in ["secret", "secret.txt"] . Sie können sehen, dass dieses Muster in der Liste für die Datei /home/user/secret/secret.txt , beginnend bei Offset 3: [ROOT, "home", "user", "secret", "secret.txt"] , also passt das Muster.

Wenn Sie Platzhalter ( * , ? usw.) in einer Pfadkomponente haben, werden diese ebenfalls getestet. Für Ihr erstes Beispiel würde also ein Muster von /home/user/secret* dem Pfad /home/user/secret2 .

Alle diese Beispiele sollten meiner Meinung nach im Handbuch dokumentiert sein.

Erwischt. Vielen Dank.

Sind negative Ausschlüsse ala .gitignore möglich?
sagen, ich möchte alle Inhalte in Verzeichnissen mit dem Namen .meteor ausschließen, außer dem verschachtelten Verzeichnis .meteor/local/db, könnte ich dies tun?

/etc/restic/excludes:
.meteor/ !.meteor/local/db
restic backup exclude-file=/etc/restic/excludes

Nein, das ist noch nicht implementiert.

Das Dokumentieren von Einschluss-/Ausschlussbeispielen wird in #396 verfolgt. Ich schließe dieses Thema hier.

@ fd0 i Wege versuchen ausschließen wie unter Jobs / / Jobs / / Builds / ** / Archiv Verzeichnis aus allen Verzeichnissen würde das funktionieren auszuschließen archivieren. Und ich habe mehrere solche Pfade, die ich ausschließen muss. Wenn möglich, können Sie mir den besten Weg vorschlagen, um mit dieser Art umzugehen, da ich in der Dokumentation kein Beispiel für eine solche Art finden kann

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

fd0 picture fd0  ·  4Kommentare

axllent picture axllent  ·  4Kommentare

TheLastProject picture TheLastProject  ·  3Kommentare

fd0 picture fd0  ·  3Kommentare

e2b picture e2b  ·  4Kommentare