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?
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
L'option -C
fonctionne; juste pour clarification je posterai 2 exemples:
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
.
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'extraitproject
: 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
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é.
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.
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/
/
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