Tar un directorio, pero no almacene rutas absolutas completas en el archivo

Resuelto QuentinC asked hace 11 años • 9 respuestas

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/site1de 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?

QuentinC avatar Sep 08 '13 14:09 QuentinC
Aceptado
tar -cjf site1.tar.bz2 -C /var/www/site1 .

En el ejemplo anterior, tar cambiará de directorio /var/www/site1antes de hacer su trabajo porque -C /var/www/site1se le dio la opción.

De man tar:

OTHER OPTIONS

  -C, --directory DIR
       change to directory DIR
Lars Brinkhoff avatar Sep 08 '2013 07:09 Lars Brinkhoff

La opción -Cfunciona; Solo para aclarar, publicaré 2 ejemplos:

  1. creación de un tarball sin la ruta completa: ruta completa /home/testuser/workspace/project/application.wary lo que queremos es project/application.warasí:

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

    Nota: hay un espacio entre workspacey project; tar reemplazará la ruta completa con solo project.

  2. 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/
    

    tarextraerá el tarball basándose en la ruta dada y preservando la ruta de creación; En nuestro ejemplo, el archivo application.warse 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
Grizli avatar Dec 03 '2014 15:12 Grizli