web-dev-qa-db-fra.com

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

J'ai la commande suivante dans la partie d'un script 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épertoires et de fichiers dans l’archive, afin de simplifier l’extraction et d’éviter une structure de répertoires constante et inutile. Je ne sais jamais, au cas où j'extraireais 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, j'aimerais avoir:

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

Ainsi, lors de l'extraction, les fichiers sont extraits dans le répertoire en cours et je n'ai pas besoin de les déplacer par la suite, et les structures de sous-répertoires sont préservées.

Il y a déjà beaucoup de questions sur tar et la sauvegarde dans stackoverflow et à d'autres endroits sur le Web, mais la plupart d'entre elles demandent de supprimer la structure entière du sous-répertoire (aplatissement), ou simplement d'ajouter ou de supprimer l'initiale/dans les noms (je n 'sais pas ce que ça change exactement quand on extrait), mais pas plus.

Après avoir lu certaines 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 souhaite. Certains ne font rien, d'autres n'archivent plus de sous-répertoires.

C'est dans 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 en cours; il est donc toujours nécessaire d'écrire un chemin absolu, et je préférerais ne pas changer le répertoire en cours. pour éviter de casser quelque chose de plus dans le script (car il ne s'agit pas seulement de sauvegarder des sites Web, mais aussi des bases de données, puis d'envoyer tout cela au FTP, etc.)

Comment y parvenir?

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

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

Dans l'exemple ci-dessus, tar passera dans le répertoire /var/www/site1 avant de procéder, car l'option -C /var/www/site1 a été donnée.

De man tar:

OTHER OPTIONS

  -C, --directory DIR
       change to directory DIR
264
Lars Brinkhoff

L'option -C fonctionne; juste pour clarification je posterai 2 exemples:

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

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

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

  2. extraction de l'archive avec modification du chemin cible (par défaut ., i.e répertoire actuel)

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

    tar extraira l'archive tar en fonction du chemin d'accès donné 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é à l'extrait
    project: donnée lors de la création de l'archive

Remarque: si vous souhaitez placer l'archive créée dans un répertoire cible, vous devez simplement ajouter le chemin cible avant le nom de l'arbalète. par exemple.: 

tar -cvf /path/to/place/output_filename.tar  -C /home/testuser/workspace project
28
Grizli

L’option -C jusqu’à tar v2.8.3 ne fonctionne pas de manière uniforme sur toutes les plateformes (systèmes d’exploitation). L'option -C ajoute un répertoire à l'archive, mais sous Mac et Ubuntu, elle ajoute le préfixe de chemin absolu dans le fichier tar.gz généré.

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

Par conséquent, la solution cohérente et robuste consiste à cd dans source_path (répertoire parent du rép_source) et à exécuter 

tar target_path/file.tar.gz source_dir

ou

tar -cf target_path/file.tar.gz source_dir

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

6
Chinthaka Senanayaka

La commande suivante créera un répertoire racine "." et placez-y tous les fichiers du répertoire spécifié.

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

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

tar -cjf target_path/file.tar.gz *

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

4
WLatif

L'utilisation du "point" conduit à la création d'un dossier nommé "point" (sur Ubuntu 16).

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

J'ai traité cette question plus en détail et préparé un exemple. Enregistrement multiligne, plus une exception.

tar -tf site1.bz2\
    -C /var/www/site1/ style.css\
    -C /var/www/site1/ index.html\
    -C /var/www/site1/ page2.html\
    -C /var/www/site1/ page3.html\
    --exclude=images/*.Zip\
    -C /var/www/site1/ images/
    -C /var/www/site1/ subdir/
/
0
Sergey Asachev

Si vous souhaitez archiver un sous-répertoire et un chemin de sous-répertoire trim, cette commande sera utile:

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