Restic: Impossible de trouver les documents pour la syntaxe du fichier d'exclusion

Créé le 8 juin 2017  ·  17Commentaires  ·  Source: restic/restic

Je n'arrive pas à trouver de documents sur la façon dont la syntaxe du fichier d'exclusion est analysée.

c'est-à-dire prend-il en charge les caractères génériques ? expression régulière ? comment fait-il la différence entre les fichiers et les répertoires ? les préfixes de chemin sont-ils nécessaires ? d'où (cwd/ou root ?) ?

Quelques exemples:

.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

Commentaire le plus utile

Pour répondre déjà à quelques unes de vos questions :

  • Tous les modèles sont testés par rapport au chemin complet d'un fichier/répertoire à enregistrer
  • Les chemins/motifs relatifs correspondront n'importe où en dessous du chemin à enregistrer
  • Pour le moment, il n'y a aucun moyen de faire la distinction entre un fichier et un répertoire, donc --exclude foo exclura tous les fichiers et répertoires nommés foo . Il en va de même pour --exclude foo/ .

À partir de votre fichier d'exclusion :

  • ._* correspondra à tous les fichiers et répertoires dont le nom commence par un point et un trait de soulignement
  • desktop.ini correspondra exactement à tous les fichiers appelés desktop.ini . Ainsi, desktop.ini.bak n'est pas exclu et enregistré dans l'instantané.
  • .Trash-* exclut les fichiers/répertoires nommés .Trash- , .Trash-foobar , etc.
  • .tmp$ exclut tous les fichiers/répertoires littéralement nommés .tmp$ , c'est-à-dire un point, suivi de tmp , suivi d'un signe dollar. Aucune extension d'expression régulière.
  • ~$ exclut tous les fichiers/répertoires littéralement nommés tilde dollar. Pour exclure tous les fichiers/répertoires se terminant par un tilde, utilisez *~ .
  • ~/.cache exclut le répertoire .cache dans tous les répertoires appelés tilde. Pour exclure le répertoire de cache dans votre répertoire personnel uniquement, utilisez $HOME/.cache (le tilde n'est pas développé, les variables d'environnement le sont, mais uniquement dans un fichier lu via --exclude-file , dans la ligne de commande le shell se développe les deux).
  • /full/path/to/directory/.syncthing/index* exclut toutes les choses dont le nom commence par index dessous de /full/path/to/directory/.syncthing .

Tous les 17 commentaires

Salut, as-tu vu

Les modèles utilisent filepath.Glob en interne, voir filepath.Match pour la syntaxe. De plus, ** exclut les sous-répertoires arbitraires. Les variables d'environnement dans les fichiers d'exclusion sont étendues avec os.ExpandEnv.

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

Je pense que cela devrait répondre à vos questions.

Je suis allé à la documentation à l' adresse https://restic.readthedocs.io/en/latest/manual.html et j'ai recherché l'exclusion, où elle n'inclut malheureusement aucun exemple courant (ou une référence à l'autre documentation de manual.rst ) :/

J'ai lu la doc golang et je pense que l'utilisateur final (moi!) Ne saura pas à quoi restic compare une exclusion à l'interne - est-ce le chemin complet (par exemple racine du référentiel (/bla ou bla), ou par rapport au cwd (moi/bla quand je suis à /home) ?

Merci d'avoir soulevé ce problème, je pense que vous avez un point valable. Le manuel devrait expliquer les filtres d'exclusion sans faire référence à godoc.org, et d'autres exemples sont nécessaires.

Pour répondre déjà à quelques unes de vos questions :

  • Tous les modèles sont testés par rapport au chemin complet d'un fichier/répertoire à enregistrer
  • Les chemins/motifs relatifs correspondront n'importe où en dessous du chemin à enregistrer
  • Pour le moment, il n'y a aucun moyen de faire la distinction entre un fichier et un répertoire, donc --exclude foo exclura tous les fichiers et répertoires nommés foo . Il en va de même pour --exclude foo/ .

À partir de votre fichier d'exclusion :

  • ._* correspondra à tous les fichiers et répertoires dont le nom commence par un point et un trait de soulignement
  • desktop.ini correspondra exactement à tous les fichiers appelés desktop.ini . Ainsi, desktop.ini.bak n'est pas exclu et enregistré dans l'instantané.
  • .Trash-* exclut les fichiers/répertoires nommés .Trash- , .Trash-foobar , etc.
  • .tmp$ exclut tous les fichiers/répertoires littéralement nommés .tmp$ , c'est-à-dire un point, suivi de tmp , suivi d'un signe dollar. Aucune extension d'expression régulière.
  • ~$ exclut tous les fichiers/répertoires littéralement nommés tilde dollar. Pour exclure tous les fichiers/répertoires se terminant par un tilde, utilisez *~ .
  • ~/.cache exclut le répertoire .cache dans tous les répertoires appelés tilde. Pour exclure le répertoire de cache dans votre répertoire personnel uniquement, utilisez $HOME/.cache (le tilde n'est pas développé, les variables d'environnement le sont, mais uniquement dans un fichier lu via --exclude-file , dans la ligne de commande le shell se développe les deux).
  • /full/path/to/directory/.syncthing/index* exclut toutes les choses dont le nom commence par index dessous de /full/path/to/directory/.syncthing .

Merci @fd0

Donc, avec "répertoire actuel", vous ne voulez pas dire le répertoire dans lequel j'étais lorsque j'ai lancé la sauvegarde, mais le répertoire qui restic est actuellement en train d'examiner les fichiers (à part les exclusions qui commencent par une barre oblique). J'ai compris.

Le comportement des fichiers et des répertoires est légèrement inattendu, je me serais attendu à ce que --exclude foo/ sauvegarde le répertoire mais pas le contenu, tandis que --exclude foo ne sauvegarde ni l'un ni l'autre. Je ne sais pas pourquoi, à partir de rsync, je suppose.

Mes exemples en ont raté un important : les espaces ! Je suppose que je dois échapper à ces métacaractères et shell avec une barre oblique inverse.

J'ai fini par copier beaucoup de ceux-ci : https://gist.github.com/jut/e2eaedad6b9e29d95977fea0ddffae7d

Les commentaires sont-ils autorisés dans le fichier d'exclusion ? Edit : https://github.com/restic/restic/pull/916/commits/c796d84fca48feea91ca3e85fbf38e16f764a468 ressemble à un hachage est le caractère de commentaire.

Ah, je crains que ce ne soit toujours pas tout à fait correct. Je vais décrire comment restic évalue les modèles d'exclusion. Supposons que restic soit exécuté par un utilisateur dans son répertoire personnel ( /home/user ) comme ceci :

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

Ensuite, restic verra les arguments de ligne de commande suivants (après expansion par le shell):

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

Ensuite, il commence à parcourir /home/user . La liste suivante décrit ce qui se passe lorsque le fichier/répertoire nommé est vu. restic teste toujours le chemin complet par rapport aux modèles :

  • fichier /home/user/foo.bak : Le motif *.bak correspond et le fichier n'est pas enregistré. Le modèle n'est pas absolu, il correspond donc partout pour tous les fichiers se terminant par .bak .
  • dir /home/user/secret : Le motif absolu /home/user/secret correspond, donc le dir n'est pas enregistré et n'est pas parcouru
  • dir /home/user/foo/home/user/secret : Aucun motif ne correspond, donc le répertoire est enregistré.
  • dir /home/user/work/extra : Le motif extra correspond, le dir n'est pas enregistré.

J'espère que c'est un peu plus clair maintenant, je vais ajouter une section au manuel décrivant le processus. Le point clé à retenir est que les modèles sont évalués par rapport au chemin complet des fichiers lors de la sauvegarde. Donc, si vous voulez faire correspondre un seul répertoire, utilisez le chemin complet, sinon il peut correspondre plusieurs fois quelque part.

D'autres questions ? :)

J'ai d'autres questions et j'apprécie beaucoup le temps que vous prenez pour y répondre. C'est vraiment une question sur l'ancrage automagique des modèles. Je pense que je peux deviner la réponse (nous comptons sur le chemin absolu étant assez unique et nous donnant le comportement que nous voulons), mais il est préférable de demander et d'être sûr.

Le modèle absolu /home/user/secret correspondrait-il à /home/user/secret2 ? (Et si vous ne le voulez pas ?)
Le modèle absolu /home/user/secret correspondrait-il à /home/user/somemount/home/user/secret ?

Dans les deux cas : Non, le modèle ne correspondra pas.

Pourquoi donc? Edit : je suis content que ce ne soit pas le cas, mais je ne vois pas pourquoi :)

Le code correspondant ici est calqué sur ce que ferait un shell : si vous vous demandiez si le fichier /home/user/secret2 existe, qu'est-ce que ls /home/user/secret imprimerait (à condition que le fichier secret n'existe pas)?

En termes plus formels : si le motif commence par un / il est absolu et le motif doit correspondre au début de la chaîne testée, donc le motif /home/user/secret ne correspond pas à /home/user/somemount[...] : Le motif n'est pas un préfixe de la chaîne.

Vous pouvez imaginer par vous-même que le modèle et le chemin du fichier sont tous deux divisés en leurs composants respectifs :

  • /home/user/secret est divisé en [ROOT, "home", "user", "secret"] et le fichier /home/user/somemount/home/user/secret est divisé en [ROOT, "home", "user", "somemount", "home", "user", "secret"] . La chaîne ROOT est utilisée dans cet exemple pour marquer le répertoire racine. Vous pouvez voir que le motif n'est pas contenu dans le nom du fichier.

    • Regardons le fichier /home/user/secret2 , qui est divisé en [ROOT, "home", "user", "secret2"] . Encore une fois, vous pouvez voir que le motif n'est pas contenu dans le nom du fichier.

  • Pour le fichier /home/user/secret/secret.txt , qui est divisé en [ROOT, "home", "user", "secret", "secret.txt"] vous pouvez voir que le motif est bien contenu dans le nom du fichier, juste au début : [ROOT, "home", "user", "secret", ...] , donc le motif correspond et le fichier est exclu.
  • Disons que nous avons un modèle d'exclusion relative de secret/secret.txt , qui est divisé en ["secret", "secret.txt"] . Vous pouvez voir que ce motif se trouve dans la liste du fichier /home/user/secret/secret.txt , à partir de l'offset 3 : [ROOT, "home", "user", "secret", "secret.txt"] , donc le motif correspond.

Lorsque vous avez des caractères génériques ( * , ? et ainsi de suite) dans un composant de chemin, ils sont également testés. Ainsi, pour votre premier exemple, un motif de /home/user/secret* correspondrait au chemin /home/user/secret2 .

Tous ces exemples devraient être documentés dans le manuel je pense.

Je t'ai eu. Merci.

Les exclusions négatives sont-elles possibles ala .gitignore ?
dire que je veux exclure tout le contenu des répertoires nommés .meteor à l'exception du répertoire imbriqué .meteor/local/db, pourrais-je le faire ?

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

Non, ce n'est pas encore implémenté.

La documentation des exemples d'inclusion/exclusion est répertoriée dans le numéro 396, je ferme ce problème ici.

@fd0 j'essaie d'exclure des chemins comme ci-dessous jobs/ /jobs/ /builds/**/archive pour exclure le répertoire d'archive de tous les répertoires qui fonctionneraient. Et j'ai plusieurs chemins comme celui-ci que je dois exclure, si possible pouvez-vous me suggérer la meilleure façon de traiter ce type car je ne trouve aucun exemple de ce type dans la documentation

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

jpic picture jpic  ·  3Commentaires

TheLastProject picture TheLastProject  ·  3Commentaires

fd0 picture fd0  ·  4Commentaires

christian-vent picture christian-vent  ·  3Commentaires

ikarlo picture ikarlo  ·  4Commentaires