J'ai la commande suivante dans la partie d'un script shell de sauvegarde:
tar -cjf site1.bz2 /var/www/site1/
Lorsque j'énumère le contenu de l'archive, j'obtiens:
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
du répertoire et des noms 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'extraireais des sites Web sauvegardés dans un endroit où les données Web n'étaient pas stockées /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, lorsque je procède à l'extraction, les fichiers sont extraits dans le répertoire courant et je n'ai pas besoin de déplacer les fichiers extraits par la suite, de sorte que les structures de sous-répertoires soient 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 eux demandent de supprimer toute la structure du sous-répertoire (aplatissement), ou simplement d'ajouter ou de supprimer l'initiale / dans les noms (je ne ' je ne sais pas ce qu'il change exactement lors de l'extraction), 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'eux n'a fonctionné comme je le souhaite. 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 requis pour tout, et je préférerais ne pas changer le répertoire actuel pour éviter de casser quelque chose de plus dans le script (car il sauvegarde non seulement les sites Web, mais aussi les bases de données, puis envoie tout cela sur FTP, etc.)
Comment y parvenir?
Ai-je juste mal compris le fonctionnement de l'option -C?
-C
signifie simplement "changer de répertoire", tout en remplaçant un chemin (ou préfixe) ne peut être fait que par--transform
. rif. superuser.com/questions/595510/prepend-prefix-in-tar/595512 vous pouvez simplement -C (changer de répertoire) et --transformer: `` `tar cjf site1.bz2 --transform" s / ^ \. \ // $ targetbase / "-C / var / www / site1. ``Réponses:
Dans l'exemple ci-dessus, tar changera de répertoire
/var/www/site1
avant de faire son travail car l'option a-C /var/www/site1
été donnée.De
man tar
:la source
tar
d'archiver tout dans le répertoire courant. Et-C
définit le répertoire courant.tar -czvf site1.tar.gz -C /var/www/ site1
(Notez l'espace, j'utilise toujours le -C, pour passer au répertoire parent et en spécifiant le répertoire à tar au lieu de point)./folders
comment le supprimer?L'option
-C
fonctionne; juste pour clarification, je posterai 2 exemples:création d'un tarball sans le chemin complet: chemin complet
/home/testuser/workspace/project/application.war
et ce que nous voulons est justeproject/application.war
ainsi:Remarque: il y a un espace entre
workspace
etproject
; tar remplacera le chemin complet par justeproject
.extraction de l'archive tar avec changement du chemin cible (par défaut
.
, c'est- à -dire le répertoire courant)tar
extraira l'archive tar en fonction du chemin donné et en préservant le chemin de création; dans notre exemple, le fichierapplication.war
sera extrait vers/home/deploy/project/application.war
./home/deploy
: donnée sur l'extraitproject
: donnée sur la création de l'archive tarRemarque: si vous souhaitez 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:
la source
Il semble que l'
-C
option jusqu'à tar v2.8.3 ne fonctionne pas de manière cohérente sur toutes les plates-formes (OS).-C
L'option est censée ajouter un répertoire à l'archive mais sur Mac et Ubuntu, elle ajoute un préfixe de chemin absolu dans le fichier tar.gz généré.Par conséquent, la solution cohérente et robuste consiste à
cd
entrer dans source_path (répertoire parent de source_dir) et à exécuterou
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é.
la source
-cvf
ajouté aprèstar
), je trouve que le fichier tar.gz résultant n'a pas de chemins absolus à l'intérieur, ce qui est cohérent avec plusieurs autres réponses. Si vous pensez que tar est cassé ou obsolète sur les deux systèmes que j'ai utilisés pour les tests, veuillez créer un lien vers une documentation qui soutiendrait votre réponse. Je pense que l'-C
option change de répertoire avant de s'exécuter (comme dans les autres réponses). Lorsque je l'omet, tar essaie d'ajouter des fichiers indésirables à partir de./
, y compris les chemins à partir de./
.cd
abord. Votre réponse dit que l'outil fonctionne de la manière opposée de la façon dont les documents disent qu'il fonctionne et comment il fonctionne sur mon système, donc c'est une mauvaise réponse. Vous pouvez facilement le réparer.La commande suivante créera un répertoire racine "." et y mettre tous les fichiers du répertoire spécifié.
Si vous voulez mettre tous les fichiers à la racine du fichier tar, @chinthaka a raison. Entrez simplement dans le répertoire et faites:
Cela mettra tous les fichiers du cwd dans le fichier tar en tant que fichiers racine.
la source
L'utilisation du "point" conduit à la création d'un dossier nommé "point" (sur Ubuntu 16).
J'ai traité cela plus en détail et préparé un exemple. Enregistrement sur plusieurs lignes, plus une exception.
la source
.
, qui est le répertoire courant. Dans le contexte de latar.gz
structure de, c'est juste le niveau de base / racine / supérieur, non?Si vous souhaitez archiver un sous-répertoire et couper le chemin du sous-répertoire, cette commande sera utile:
la source