Qu'est-ce qui ne fonctionne pas exactement comme prévu?
34
Ce n'est pas un problème. Vous ne voulez pas de barres obliques dans les archives tar. Sérieusement. Si vous souhaitez extraire une archive à la racine de votre système, spécifiez -C /lors de son extraction.
ThiefMaster
Réponses:
69
Utilisez l' option --absolute-namesou -Ppour désactiver cette fonctionnalité.
tar fczP bkup.tar.gz /home/foo/
tar fcz bkup.tar.gz --absolute-names /home/foo
C'est la bonne réponse, mais sachez que dans la plupart des cas, ce n'est pas ce que vous voulez , car il en résulte une archive qui extrait dans des chemins complets!
rubo77
8
Utiliser l' -C /option décrite dans la réponse de @Marcus supprimera le message STDERR s'il s'agit de votre objectif principal.
Matt Sanders
1
Comme @ rubo77 l'a commenté, il ne s'agit généralement pas du résultat attendu de la commande.
alfredocambera
3
La plupart du temps, ce n'est pas ce que veut l'utilisateur, tout simplement parce que la plupart d'entre eux ne lisent pas le manuel tant qu'ils n'en ont pas besoin (personne n'a le temps de le faire). Donc, il serait sage, au moins, d’élargir votre réponse, en avertissant les gens de ne pas le faire, à moins qu’ils ne soient absolument certains de comprendre quel en est l’effet. Surtout être accepté comme une réponse.
Mladen B.
1
@Toskan Exemples ajoutés
Barmar
89
C'est en fait une fonctionnalité, pas un problème. Les archives avec des emplacements absolus constituent un risque pour la sécurité. Les pirates pourraient utiliser de telles archives pour amener les utilisateurs à installer des fichiers dans des emplacements critiques du système.
Oui, vous pourriez utiliser -P. Mais qu'y a-t-il de mal à autoriser tar à supprimer la barre oblique, et à simplement demander à l'utilisateur de l'archive de procéder explicitement à l'extraction dans le répertoire racine? Ensuite, ils ont un impact conscient sur les emplacements critiques du système et ne peuvent le faire par accident.
Parfois, les fonctionnalités sont des problèmes. J'ai trouvé ce fil après avoir configuré un script de sauvegarde permettant d'envoyer par courrier électronique un état de sortie différent de zéro tar. Ce message en particulier provoquait la fermeture taravec un statut 1, ce qui me permettait de recevoir de fausses alertes par e-mail sur les sauvegardes réussies, tout simplement parce que tarce message était écrit pour STDERR. J'ai résolu ce problème en utilisant ma propre version modifiée de la solution de @ Marcus:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
rubynorails
1
Je pense qu'il y a des cas d'utilisation -P, par exemple si vous fournissez une fonctionnalité de capture instantanée de système de fichiers dans FUSE. Parfois, vous voudrez peut-être décompresser un instantané dans un répertoire spécifique plutôt que cwddu point de vue de l'utilisateur.
Dimm
81
Si vous voulez vous débarrasser de "Suppression des` / 'des principaux noms de membres "en cours d'impression sur STDERR, mais que vous souhaitiez tout de même laisser ces barres obliques comme le fait sagement tar, par défaut, j'ai trouvé une excellente solution ici, de la part de commenter timsoft.
La solution implique l'utilisation de l'option -C pour changer le répertoire à la racine (/), puis la spécification de l'arborescence de fichiers à archiver sans barre oblique car maintenant vous n'avez besoin que d'un chemin relatif. Cela fait la même chose qu'une commande tar create normale, mais aucune suppression n'est nécessaire:
Cela ne fonctionnera pas avec les sauvegardes incrémentielles. Mais une bonne réponse.
gajdipajti
Cela ne fonctionne pas non plus si vous voulez tarer des fichiers dénotés par une expansion du shell (par exemple tar c -C / home/foo/*), car le shell ne connaît pas la racine modifiée. Mais toujours une bonne réponse pour les autres cas.
Boris
1
-C /ça ne marche pas pour moi, point. Cela n'empêche pas le stderr pour moi.
Acumenus
3
@ABB assurez-vous que le chemin suivant C / est relatif.
zurfyx
Cette approche fonctionnera-t-elle si un utilisateur ne dispose pas d'autorisations sur le répertoire racine?
Mladen B.
31
Un mois de retard, mais j'ai trouvé la solution la plus appropriée à mon cas (dans un script shell): aller dans le répertoire parent et y exécuter la commande.
En effet, vous auriez pu le faire avec: tar -zcvf mysite.gz -C / var / www / mysite / L’avantage de cela est que vous pouvez l’exécuter à partir de n’importe quel répertoire
alfredocambera
Merci de votre aide. C'est ce dont j'avais besoin. Je ne voulais pas le chemin complet dans mon archive, mais juste le dossier de destination.
Christia
Cela aurait probablement dû être accepté comme une réponse correcte, je pense.
Mladen B.
Je ne vois pas comment cela répond à la question. C'est quelque chose de différent qui pourrait être fait. ……… Comme: Q: Comment puis-je aller de Los Angeles à New York? A: Allez à San Francisco à la place.
G-Man
Je suis d'accord avec @ G-Man. Cela se traduira par un fichier tar avec une structure de répertoire complètement différente. Dans certains cas, cette structure de répertoire est en fait plus appropriée au départ, mais elle ne répond pas à la question.
Kevin Keane
7
Voici comment je l' ai fait en utilisant la méthode de la force brute: 2>&1 | grep -v "Removing leading".
Le problème avec ceci est qu'il cache le code d'erreur. Donc, si vous voulez vérifier le code d'erreur de tar dans un script bash, il ne renverra pas 0 en cas de succès.
Brian
@staticx, le code d'erreur est 0 peu importe.
Acumenus
1
@ABB Ma tarcommande peut retourner 2en cas d'erreur fatale.
Ainsi, vous n'essayez pas de définir des chemins absolus dans l'archive tar. Si vous voulez décompresser à la racine du système de fichiers, vous venez
cd / && tar xzf backupt.tar.gz après l'avoir transféré.
-C /
lors de son extraction.Réponses:
Utilisez l' option
--absolute-names
ou-P
pour désactiver cette fonctionnalité.la source
-C /
option décrite dans la réponse de @Marcus supprimera le message STDERR s'il s'agit de votre objectif principal.C'est en fait une fonctionnalité, pas un problème. Les archives avec des emplacements absolus constituent un risque pour la sécurité. Les pirates pourraient utiliser de telles archives pour amener les utilisateurs à installer des fichiers dans des emplacements critiques du système.
Oui, vous pourriez utiliser
-P
. Mais qu'y a-t-il de mal à autoriser tar à supprimer la barre oblique, et à simplement demander à l'utilisateur de l'archive de procéder explicitement à l'extraction dans le répertoire racine? Ensuite, ils ont un impact conscient sur les emplacements critiques du système et ne peuvent le faire par accident.la source
tar
. Ce message en particulier provoquait la fermeturetar
avec un statut1
, ce qui me permettait de recevoir de fausses alertes par e-mail sur les sauvegardes réussies, tout simplement parce quetar
ce message était écrit pour STDERR. J'ai résolu ce problème en utilisant ma propre version modifiée de la solution de @ Marcus:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
-P
, par exemple si vous fournissez une fonctionnalité de capture instantanée de système de fichiers dans FUSE. Parfois, vous voudrez peut-être décompresser un instantané dans un répertoire spécifique plutôt quecwd
du point de vue de l'utilisateur.Si vous voulez vous débarrasser de "Suppression des` / 'des principaux noms de membres "en cours d'impression sur STDERR, mais que vous souhaitiez tout de même laisser ces barres obliques comme le fait sagement tar, par défaut, j'ai trouvé une excellente solution ici, de la part de commenter timsoft.
La solution implique l'utilisation de l'option -C pour changer le répertoire à la racine (/), puis la spécification de l'arborescence de fichiers à archiver sans barre oblique car maintenant vous n'avez besoin que d'un chemin relatif. Cela fait la même chose qu'une commande tar create normale, mais aucune suppression n'est nécessaire:
la source
tar c -C / home/foo/*
), car le shell ne connaît pas la racine modifiée. Mais toujours une bonne réponse pour les autres cas.-C /
ça ne marche pas pour moi, point. Cela n'empêche pas le stderr pour moi.Un mois de retard, mais j'ai trouvé la solution la plus appropriée à mon cas (dans un script shell): aller dans le répertoire parent et y exécuter la commande.
Au lieu de:
la source
Voici comment je l' ai fait en utilisant la méthode de la force brute:
2>&1 | grep -v "Removing leading"
.Par exemple:
la source
tar
commande peut retourner2
en cas d'erreur fatale.Essayez d’utiliser
-C
uniquement un chemin qui empêcherait la compression avec des chemins complets:la source
J'ai résolu ce problème avec:
cd /home/foo && tar czf ~/backup.tar.gz .
Ainsi, vous n'essayez pas de définir des chemins absolus dans l'archive tar. Si vous voulez décompresser à la racine du système de fichiers, vous venez
cd / && tar xzf backupt.tar.gz
après l'avoir transféré.la source