Tar un directorio, pero no almacene rutas absolutas completas en el archivo
Tengo el siguiente comando en la parte de un script de shell de respaldo:
tar -cjf site1.bz2 /var/www/site1/
Cuando enumero 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
de los nombres de directorios y archivos dentro del archivo, para simplificar la extracción y evitar una estructura de directorios constante e inútil. Nunca se sabe, en caso de que extrajera sitios web respaldados en un lugar donde los datos web no estuvieran 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
De modo que cuando extraigo, los archivos se extraen en el directorio actual y no necesito mover los archivos extraídos después, por lo que se conservan las estructuras de subdirectorios.
Ya hay muchas preguntas sobre tar y la copia de seguridad enstackoverflow
otros lugares de la web, pero la mayoría pide eliminar toda la estructura de subdirectorios (aplanamiento), o simplemente agregar o eliminar la inicial / en los nombres (no lo hago). No sé qué cambia exactamente al extraer), pero nada más.
Después de haber leído algunas de las soluciones encontradas 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 quiero. Algunos no hacen nada, otros ya no archivan subdirectorios.
Está dentro de un script de shell de respaldo iniciado por un Cron, por lo 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 script (porque no solo hace una copia de seguridad de los sitios web, sino también de las bases de datos, y luego envía todo eso a FTP, etc.)
¿Cómo lograr esto?
¿Acabo de entender mal cómo funciona la opción -C?
tar -cjf site1.tar.bz2 -C /var/www/site1 .
En el ejemplo anterior, tar cambiará de directorio /var/www/site1
antes de hacer su trabajo porque -C /var/www/site1
se le dio la opción.
De man tar
:
OTHER OPTIONS
-C, --directory DIR
change to directory DIR
La opción -C
funciona; Solo para aclarar, publicaré 2 ejemplos:
creación de un tarball sin la ruta completa: ruta completa
/home/testuser/workspace/project/application.war
y lo que queremos esproject/application.war
así:tar -cvf output_filename.tar -C /home/testuser/workspace project
Nota: hay un espacio entre
workspace
yproject
; tar reemplazará la ruta completa con soloproject
.extracción de tarball con cambio de la ruta de destino (por defecto
.
, es decir, directorio actual)tar -xvf output_filename.tar -C /home/deploy/
tar
extraerá el tarball basándose en la ruta dada y preservando la ruta de creación; En nuestro ejemplo, el archivoapplication.war
se extraerá a/home/deploy/project/application.war
./home/deploy
: dado en el extracto
project
: dado en la creación del tarball
Nota: si desea colocar el tarball creado en un directorio de destino, simplemente agregue la ruta de destino antes del nombre del tarball. p.ej:
tar -cvf /path/to/place/output_filename.tar -C /home/testuser/workspace project