Tar un répertoire, mais ne stockez pas les chemins absolus complets dans l'archive

J'ai la commande suivante dans la partie d'un script shell de sauvegarde:

tar -cjf site1.bz2 /var/www/site1/

Lorsque je liste le contenu de l'archive, je reçois:

tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html

Mais je voudrais supprimer la partie /var/www/site1 des noms de répertoire et de fichiers dans l'archive, afin de simplifier l'extraction et d'éviter une structure de répertoire constante inutile. Je ne sais jamais, au cas où j'extrayerais des sites Web sauvegardés dans un endroit où les données web n'étaient pas stockées sous /var/www.

Pour l'exemple ci-dessus, je voudrais avoir :

tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html

Donc, quand j'extrait, les fichiers sont extraits dans le répertoire courant et je n'ai pas besoin de déplacer les fichiers extraits par la suite, et de sorte que les structures de sous-répertoires soient préservées.

Il y a déjà beaucoup de questions sur tar et backuping dans stackoverflow et à d'autres endroits sur le web, mais la plupart d'entre eux demandent de supprimer toute la structure du sous-répertoire (aplatissement), ou simplement ajouter ou supprimer l'initiale / dans les noms (Je ne sais pas ce que cela change exactement lors de l'extraction), mais non plus.

Après avoir lu certains des solutions trouvées ici et là ainsi que le manuel, j'ai essayé :

tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/

Mais aucun d'entre eux n'a fonctionné comme je le veux. Certains ne font rien, d'autres n'archivent plus de sous-répertoires.

C'est à l'intérieur d'un script shell de sauvegarde lancé par un Cron, donc je ne sais pas bien, quel utilisateur l'exécute, Quel est le chemin et le répertoire courant, donc toujours écrire un chemin absolu est nécessaire pour tout, et préférerait ne pas changer le répertoire courant pour évitez de casser quelque chose dans le script (car il ne sauvegarde pas seulement les sites Web, mais aussi les bases de données, puis envoie tout cela à FTP, etc.)

Comment y parvenir?

Ai-je mal compris comment fonctionne l'option-C?

160
demandé sur Alex.K. 2013-09-08 11:43:34

4 réponses

tar -cjf site1.tar.bz2 -C /var/www/site1 .

Dans l'exemple ci-dessus, tar passera au répertoire /var/www/site1 avant de faire son truc car l'option -C /var/www/site1 a été donnée.

À Partir de man tar:

OTHER OPTIONS

  -C, --directory DIR
       change to directory DIR
232
répondu Lars Brinkhoff 2015-06-11 09:50:34

L'option -C fonctionne; juste pour clarifier je vais poster 2 Exemples:

  1. Création d'une archive sans le chemin complet: chemin complet /home/testuser/workspace/project/application.war et ce que nous voulons est juste project/application.war donc:

    tar -cvf output_filename.tar  -C /home/testuser/workspace project
    

    Note: il y a un espace entre workspace et project; tar remplacera le chemin complet par juste project.

  2. Extraction de l'archive tar avec modification du chemin cible (valeur par défaut ., c'est-à-dire répertoire courant)

    tar -xvf output_filename.tar -C /home/deploy/
    

    tar va extraire tarball basé sur donné chemin d'accès et en préservant le chemin de création; dans notre exemple, le fichier application.war sera extrait à /home/deploy/project/application.war.

    /home/deploy: donné sur l'extrait de
    project: compte tenu de la création de l'archive

Remarque: Si vous voulez placer l'archive tar créée dans un répertoire cible, il vous suffit d'ajouter le chemin cible avant le nom de l'archive tar. par exemple:

tar -cvf /path/to/place/output_filename.tar  -C /home/testuser/workspace project
25
répondu Grizli 2016-05-04 07:21:13

La commande suivante va créer un répertoire racine "."et mettez tous les fichiers du répertoire spécifié dans celui-ci.

tar -cjf site1.tar.bz2 -C /var/www/site1 .

Si vous voulez mettre tous les fichiers à la racine du fichier tar, @chinthaka a raison. Juste cd dans le répertoire et faire:

tar -cjf target_path/file.tar.gz *

Cela mettra tous les fichiers du cwd dans le fichier tar en tant que fichiers racine.

4
répondu WLatif 2016-10-05 11:24:45

Semble que beaucoup ont mal compris l'option -C dans tar.

tar target_path/file.tar.gz -C source_path/source_dir .

Ou

tar target_path/file.tar.gz -C source_path/source_dir

Ne supprimera pas le préfixe de chemin absolu dans le tar généré.fichier gz.

La solution la plus simple consiste à cd dans source_path (répertoire parent de source_dir) et à exécuter

tar target_path/file.tar.gz source_dir

Dans votre script. Cela supprimera le préfixe de chemin absolu dans votre tar généré.structure de répertoire du fichier gz.

4
répondu Chinthaka Senanayaka 2016-10-05 11:30:09