tar: Suppression des `/ 'des premiers noms de membres

137
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names

Comment puis-je résoudre ce problème et conserver les /noms de fichiers?

super-utilisateur
la source
2
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
Barmar
la source
54
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.

Mark Adler
la source
5
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:

tar fcz bkup.tar.gz -C / home/foo/
Marcus
la source
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.

cd /var/www/
tar -czf mysite.gz mysite

Au lieu de:

tar -czf /var/www/mysite.gz /var/www/mysite
amd
la source
9
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".

Par exemple:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"
bjackfly
la source
4
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.
Jite
1
@ Brian vous pouvez utiliser $ PIPESTATUS pour obtenir le code de sortie. Voir unix.stackexchange.com/questions/14270/…
simpleuser
3

Essayez d’utiliser -Cuniquement un chemin qui empêcherait la compression avec des chemins complets:

root@server # tar fcz bkup.tar.gz -C /home/ foo/
Nick Tsai
la source
2

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é.

James
la source