visualizar ver listar extraer directorio crear copiar contenido con como archivos archivo linux bash backup tar

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:

  1. creación de un tarball sin la ruta completa: ruta completa /home/testuser/workspace/project/application.war y lo que queremos es solo project/application.war entonces:

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

    Nota: hay un espacio entre el espacio de workspace y el project ; tar reemplazará la ruta completa con solo project .

  2. 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 archivo application.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