linux - ver - Tar un directorio, pero no almacena rutas absolutas completas en el archivo
visualizar archivos tar (4)
El siguiente comando creará un directorio raíz "." y poner todos los archivos del directorio especificado en él.
tar -cjf site1.tar.bz2 -C /var/www/site1 .
Si desea poner todos los archivos en la raíz del archivo tar, @chinthaka tiene razón. Simplemente ingrese al directorio y haga:
tar -cjf target_path/file.tar.gz *
Esto colocará todos los archivos en el cwd en el archivo tar como archivos raíz.
Tengo el siguiente comando en la parte de un script de shell de respaldo:
tar -cjf site1.bz2 /var/www/site1/
Cuando lista el contenido del archivo, obtengo:
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
Pero me gustaría eliminar la parte /var/www/site1
del directorio y los nombres de archivo dentro del archivo, para simplificar la extracción y evitar una estructura de directorio constante inútil. Nunca lo sé, en caso de que extrajera sitios web respaldados en un lugar donde los datos web no estaban almacenados en /var/www
.
Para el ejemplo anterior, me gustaría tener:
tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html
Entonces, cuando extraigo, los archivos se extraen en el directorio actual y no es necesario mover los archivos extraídos después, y para que las estructuras de los subdirectorios se conserven.
Ya hay muchas preguntas sobre alquitrán y copia de seguridad en stackoverflow
y en otros lugares en la web, pero la mayoría de ellos piden que se elimine toda la estructura del subdirectorio (aplanamiento), o simplemente agreguen o eliminen la inicial / en los nombres (yo don ''t saber lo que cambia exactamente al extraer), pero no más.
Después de haber leído algunas de las soluciones que se encuentran aquí y allá, así como el manual, probé:
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/
Pero ninguno de ellos funcionó como yo quería. Algunos no hacen nada, otros ya no archivan los subdirectorios.
Está dentro de un script de shell de respaldo lanzado por un Cron, así que no sé bien, qué usuario lo ejecuta, cuál es la ruta y el directorio actual, por lo que siempre se requiere escribir la ruta absoluta para todo, y preferiría no cambiar el directorio actual para evitar romper algo más en el guión (porque no solo hace copias de seguridad de sitios web, sino también de bases de datos, y luego envía todo eso a FTP, etc.)
¿Cómo lograr esto?
¿Acabo de malinterpretar cómo funciona la opción -C?
La opción -C
funciona; solo por aclaración publicaré 2 ejemplos:
creación de un tarball sin la ruta completa: ruta completa
/home/testuser/workspace/project/application.war
y lo que queremos es soloproject/application.war
entonces:tar -cvf output_filename.tar -C /home/testuser/workspace project
Nota: hay un espacio entre el espacio de
workspace
y elproject
; tar reemplazará la ruta completa con soloproject
.extracción de tarball con el cambio de la ruta de destino (por defecto a
.
, es decir, directorio actual)tar -xvf output_filename.tar -C /home/deploy/
tar
extraerá tarball basado en una ruta determinada y preservará la ruta de creación; en nuestro ejemplo, el archivoapplication.war
se extraerá en/home/deploy/project/application.war
./home/deploy
: dado en extracto
project
: dado en la creación de tarball
Nota: si desea colocar el tarball creado en un directorio de destino, simplemente agregue la ruta de destino antes del nombre de tarball. p.ej:
tar -cvf /path/to/place/output_filename.tar -C /home/testuser/workspace project
Parece que muchos han malentendido la opción -C
en tar.
tar target_path/file.tar.gz -C source_path/source_dir .
o
tar target_path/file.tar.gz -C source_path/source_dir
no eliminará el prefijo de ruta absoluta dentro del archivo tar.gz generado.
La solución más simple es hacer un cd
en source_path (directorio padre de source_dir) y ejecutar
tar target_path/file.tar.gz source_dir
en tu script Esto eliminará el prefijo de ruta absoluta en la estructura de directorios del archivo tar.gz generado.
tar -cjf site1.tar.bz2 -C /var/www/site1 .
En el ejemplo anterior, tar cambiará al directorio /var/www/site1
antes de hacer su trabajo porque se le dio la opción -C /var/www/site1
.
De man tar
:
OTHER OPTIONS
-C, --directory DIR
change to directory DIR