Restic: Autoriser le mélange des modèles d'inclusion et d'exclusion pour la sauvegarde et la restauration

Créé le 18 juil. 2015  ·  17Commentaires  ·  Source: restic/restic

Il s'agit d'un problème de suivi pour #226. Jusqu'à présent, il est uniquement possible de spécifier des modèles d'exclusion pour la sauvegarde et la restauration.

Il existe des cas d'utilisation qui ne sont pas couverts, par exemple : un utilisateur souhaite sauvegarder son répertoire personnel dans /home/user , en excluant tout ce qui se trouve dans le répertoire work exception des fichiers source C.

Y a-t-il d'autres utilisations auxquelles je n'ai pas pensé ?

Implémentation/Interface utilisateur : permet de spécifier les modèles --include et --exclude sur la ligne de commande, qui remplissent une liste commune (l'ordre importe ici). Pour chaque répertoire/fichier, vérifiez tous les modèles de la liste. L'action (exclure ou inclure) du dernier motif correspondant l'emporte. L'action par défaut (qui sera également utilisée si aucun motif d'inclusion ou d'exclusion n'est spécifié) est "include".

Cela contient déjà un cas de coin : est-ce que restic doit marcher /home/user/work du tout ?

Je pense qu'il ne devrait pas. Au lieu de cela, si c'est un comportement souhaitable, demandez à l'utilisateur d'ajouter un modèle plus spécifique pour signaler que le répertoire exclu doit également être parcouru, par exemple restic backup --exclude /home/user/work --include /home/user/work/**/*c. /home/user .

Une meilleure interface utilisateur serait de permettre de spécifier un fichier à partir duquel lire les modèles ( --pattern-file ou quelque chose comme ça). Dans ce fichier, toutes les lignes commençant par # sont des commentaires, les lignes vides sont ignorées, toutes les autres lignes doivent commencer par + (inclure) ou - (exclure) après un espace caractère et un motif. Pour le cas d'utilisation ci-dessus, un fichier de filtre ressemblerait à ceci :

# filter out everything from work, but include c source code files
- /home/user/work
+ /home/user/work/**/*.c

Ce problème peut être fermé une fois qu'une solution définitive pour avoir à la fois des modèles d'inclusion et d'exclusion est mise en œuvre.

backup restore feature enhancement

Commentaire le plus utile

Pourquoi ne pas simplement utiliser le format d'ignorance standard utilisé par .gitignore ? par exemple.

# ignore everything
*
# include $HOME/.local
!$HOME/.local

Tous les 17 commentaires

Une autre possibilité serait de lire une liste exacte de fichiers à sauvegarder à partir d'un fichier (ou de stdin). Ensuite, les gens pourraient simplement utiliser les outils qu'ils veulent (trouver, grep, etc.) pour construire leur liste et "diriger" cette liste vers restic.

Je devrais lire tout le texte avant de poster une réponse. Désolé.

C'est un problème différent, prenant la liste des fichiers/répertoires à sauvegarder à partir de stdin au lieu des arguments de ligne de commande. Pensez-vous qu'il est utile d'avoir cela? Si oui, pourriez-vous ajouter un problème?

Juste un rappel pour moi : ce problème concerne l'inclusion de filtres pour la sauvegarde, la restauration les a déjà.

Vous devriez peut-être simplement copier la syntaxe --exclude/--include/--exclude-from de rsync, ils ont 20 ans d'expérience :-)
(au moins, veuillez ajouter quelques exemples de la syntaxe actuelle au guide de l'utilisateur car il n'est pas clair si "/foo" et "foo" sont identiques ou si "*.c" est pris en charge.

Ah, merci pour le commentaire, j'ai ajouté un problème pour les exemples manquants dans le manuel : https://github.com/restic/restic/issues/396

Pour être honnête, je n'aime pas du tout la syntaxe de filtre de rsync, car les règles sont bien trop complexes. Mais nous verrons ce que nous pouvons trouver.

Les mises à jour? C'est certainement une option incontournable. Actuellement, il n'est même pas possible de lire la liste des fichiers à sauvegarder à partir du stdin :

$ find -name '*.go' | restic backup --files-from -
open -: no such file or directory

alors qu'on pourrait l'écrire

restic backup --exclude '*' --include '*.go'

Euh, la lecture de la liste des fichiers à partir de stdin peut être réalisée en appelant restic comme suit :

$ find -name '*.go' | restic backup --files-from /dev/stdin

Si vous le souhaitez, j'accepterais un PR qui ajoute la gestion de - pour --files-from . :)

@opennota voudriez-vous décrire votre cas d'utilisation ? Ce serait intéressant pour nous.

Le problème de tiret ( - ) est suivi sous le numéro 769.

@fd0
Pas vraiment un cas d'utilisation. Je veux juste sauvegarder uniquement les fichiers avec certaines extensions sans utiliser de fichier temporaire pour la liste.

Si vous le souhaitez, j'accepterais un PR qui ajoute la gestion - pour --files-from. :)

Je vais voir ce que je peux faire.

Vous pouvez en quelque sorte émuler ce comportement en utilisant sed et des tubes nommés :

restic --exclude-file <(sed -n 's/^- \(.*\)/\1/p' files.list) --files-from <(sed -n 's/^+ \(.*\)/\1/p' files.list)

Les lignes commençant par - sont exclues et celles commençant par + sont incluses.

Je pense qu'un bon modèle est ce que borg a récemment implémenté pour --pattern et --patterns-from
https://borgbackup.readthedocs.io/en/stable/usage/help.html#borg -help-patterns
Pas tant les différents sélecteurs de style, mais les options permettant de spécifier les chemins racine, les règles d'inclusion, les règles d'exclusion et les règles d'exclusion sans récurrence dans un fichier.

Pourquoi ne pas simplement utiliser le format d'ignorance standard utilisé par .gitignore ? par exemple.

# ignore everything
*
# include $HOME/.local
!$HOME/.local

Le --include est prévu pour être mis en œuvre ?

On dirait que --include et --exclude ne peuvent pas être implémentés ensemble, ou du moins seraient une hiérarchie de priorité l'un sur l'autre...

Fournir une liste de fichiers avec --files-from ne résout pas totalement le problème car la sous-commande snapshots affichera une liste gigantesque de fichiers et la sous-commande forget ne fonctionnera pas comme prévu.

Mon cas d'utilisation sauvegarde ma maison et j'ai une liste de chemins avec certaines exclusions et quelques exceptions pour l'exclusion. La liste de base des chemins contient déjà une centaine d'éléments. Comme tout est inférieur à $HOME , je m'attendrais à pouvoir dire quelque chose comme --exclude=** --include=~/path1 --include=~/path2 --exclude=~/path2/something --exclude=*~ . Ainsi, pour déterminer si un chemin doit être inclus, il doit être comparé à chaque --exclude et --include dans le bon ordre et le dernier correspondant gagne.

Je pense que les relations publiques de @vincentbernat sont une solution efficace à cette exigence.

_Résumé : autoriser les modèles négatifs de style gitignore à spécifier des règles d'exclusion pour la sauvegarde et la restauration._

Je l'utilise efficacement depuis plusieurs semaines maintenant.

Notamment, cela me permet de simplifier ma liste d'instantanés, qui était assez bavarde auparavant :

b951f6a2  2019-06-15 11:30:18  elvandar    manual      /Users/daniel/Desktop
                                                       /Users/daniel/Documents
                                                       <lots more...>

à:

d0c0bed1  2019-06-18 08:20:57  elvandar                /Users/daniel

De plus, j'ai mis en place une solution efficace (pas parfaite mais fonctionnelle) fournissant une sauvegarde continue à l' aide de cette fonctionnalité (je partagerai les détails sous peu).

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