Je veux sauvegarder tous les 'dotfiles' (fe .zshrc
) sous mon répertoire personnel avec tar , mais en excluant la structure du répertoire et tous les sous-répertoires.
Je l'ai essayé plusieurs fois avec différentes commandes, mais le meilleur que j'ai réalisé était une archive qui comprenait également les répertoires cachés $HOME
.
#!/bin/zsh
BACKUPFILE=dotfile_backup.tar.gz
tar --create --file=$HOME/$BACKUPFILE --auto-compress --no-recursion --exclude=. --exclude=.. --exclude=*/ --directory=$HOME .*
J'ai aussi pensé à utiliser find
et à canaliser le résultat sur tar, mais sans succès. Est-ce que quelqu'un sait comment accomplir cette tâche - apparemment facile -?
PS: La plupart du temps, lorsque j'utilise tar pour créer une archive, je dois penser à la bande dessinée xkcd:
:)
*(.)
- et je pense qu'il exclut.
et..
de.*
par défaut (et ils ne seraient pas repris par de.*(.)
toute façon, puisqu'il sélectionne uniquement les fichiers). Je n'utilise pas moi-même zsh, donc je ne suis pas assez sûr pour en faire une réponse.Réponses:
Vous pouvez utiliser cette commande pour sauvegarder tous vos fichiers dot (
.<something>
) dans votre$HOME
répertoire:regex en utilisant juste du goudron?
méthode # 1
J'ai fait des recherches sur ce sujet un peu et suis venu vide. Le facteur limitant serait que lorsque
tar
exécution, il est exclu, la barre oblique de fin (/
) qui s'affiche avec les répertoires ne fait pas partie de l'équation lorsque tar effectue sa correspondance de modèle.Voici un exemple:
Cette variante comprend une exclusion de
.*/
et vous pouvez voir avec le commutateur prolixe activé sur tar-v
, que ces répertoires passent par cette exclusion.méthode # 2
Je pensais que les interrupteurs
--no-wildcards-match-slash
ou--wildcards-match-slash
relâcheraient la gourmandise du.*/
mais cela n'a eu aucun effet non plus.La suppression de la barre oblique de l'exclusion
.*
n'était pas non plus une option car cela indiqueraittar
d'exclure tous les fichiers et répertoires de points:méthode # 3 (moche!)
Donc, la seule autre alternative que je peux concevoir est de fournir une liste de fichiers
tar
. Quelque chose comme ça:Cette approche pose des problèmes si le nombre de fichiers dépasse la quantité maximale d'espace pour passer des arguments à une commande serait un problème flagrant. L'autre, c'est que c'est moche et trop complexe.
alors qu'avons-nous appris?
Il ne semble pas y avoir de méthode simple et élégante pour réaliser cette utilisation
tar
des expressions régulières. Pour ce qui est du commentaire de @ terdon,find ... | tar ...
c'est vraiment la façon la plus appropriée de le faire.la source
regex
, mais j'aurais dû savoir que cela ne fonctionnerait pas de cette façon :)regex
vous aurez probablement besoin d'échapper au premier point et auront du mal à ignorer.
et..
. Je suis sûr que c'est possible, comme le démontrera probablement slm, mais je ne vois pas pourquoi cela en vaudrait la peine.find
commande trouve est passé en argumenttar
. Le{}
dit où vous voulez que ces résultats aillent dans la-exec
commande correspondante . Le+
dit d'ajouter autant de résultatsfind
que possible sur la ligne de commande et d'appelertar
seulement quelques fois plutôt que chaque fois qu'un résultat est trouvé.regex
ettar
parce qu'il n'y a aucun moyen d'isoler les répertoires de points (.blah/
). Tar n'utilise pas la barre oblique de fin lors de l'exclusion.Ce type de contrôle sur les fichiers correspondants est bien en dehors de la zone de confort de tar. Ses règles de correspondance des fichiers sont limitées à de simples correspondances sur des noms.
find
est une façon, mais puisque vous avez zsh, vous avez plus facile:Cela
.
entre parenthèses à la fin de l'expression générique est un qualificatif glob qui dit "ne correspond qu'aux fichiers normaux".Les liens symboliques vers des fichiers normaux ne correspondent pas. Si vous passez à
.*(-.)
, ils seront inclus, mais le fichier ne se retrouvera pas dans l'archive à moins qu'il ne soit également inclus. Si vous souhaitez remplacer le lien symbolique par leurs cibles, faites cela.*(-.:A)
-:A
ajoute le modificateur d'expansion de l' historique qui résout tous les liens symboliques à un chemin qui n'utilise pas de liens symboliques.la source
Cette réponse est basée sur slm, mais je vais également vous montrer comment inclure des répertoires commençant par
.
Pour compresser les fichiers dot dans votre répertoire personnel:
Pour inclure des répertoires:
Le
?
est facultatif dans la première commande, mais pas dans la seconde, sinon,find
inclura le.
répertoire (actuel).la source
qu'en est-il de:
la source