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.
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).
Commentaire le plus utile
Pourquoi ne pas simplement utiliser le format d'ignorance standard utilisé par
.gitignore
? par exemple.