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
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 se sabe, en caso de que extraiga sitios web respaldados en un lugar donde no se almacenaron los datos web /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 necesito mover los archivos extraídos después, y así se preservan las estructuras del subdirectorio.
Ya hay muchas preguntas sobre el alquitrán y la copia de seguridad en stackoverflow
y en otros lugares de la web, pero la mayoría de ellas solicitan que se elimine toda la estructura del subdirectorio (aplanamiento), o simplemente agregue o elimine la inicial / en los nombres (no lo hago ' No sé qué cambia exactamente cuando se extrae), pero no más.
Después de leer 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 yo quiero. Algunos no hacen nada, otros ya no archivan subdirectorios.
Está dentro de un script de shell de respaldo lanzado 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 una ruta absoluta para todo, y preferiría no cambiar el directorio actual para evitar romper algo más en el script (porque no solo respalda sitios web, sino también bases de datos, luego envía todo eso a FTP, etc.)
¿Cómo lograr esto?
¿Acabo de entender mal cómo funciona la opción -C?
-C
solo significa "cambiar directorio", mientras que la sustitución de una ruta (o prefijo) solo puede hacerse mediante--transform
. rif. superuser.com/questions/595510/prepend-prefix-in-tar/595512 puede simplemente -C (cambiar directorio) y --transformarlo: `` `tar cjf site1.bz2 --transform" s / ^ \. \ // $ targetbase / "-C / var / www / site1. ``Respuestas:
En el ejemplo anterior, tar cambiará a directorio
/var/www/site1
antes de hacer lo suyo porque-C /var/www/site1
se le dio la opción .De
man tar
:fuente
tar
que archive todo en el directorio actual. Y-C
establece el directorio actual.tar -czvf site1.tar.gz -C /var/www/ site1
(Tenga en cuenta el espacio, todavía estoy usando -C, para cd al directorio padre y especificando el directorio a tar en lugar de punto)./folders
¿cómo se puede eliminar?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 es simplementeproject/application.war
así:Nota: hay un espacio entre
workspace
yproject
; tar reemplazará la ruta completa con soloproject
.extracción de tarball con el cambio de la ruta de destino (por defecto
.
, es decir, el directorio actual)tar
extraerá tarball en función de la ruta dada y preservará la ruta de creación; en nuestro ejemplo el archivoapplication.war
será extraído a/home/deploy/project/application.war
./home/deploy
: dado en extractoproject
: dado en la creación de tarballNota: si desea colocar el tarball creado en un directorio de destino, simplemente agregue la ruta de destino antes del nombre del tarball. p.ej:
fuente
Parece que la
-C
opción upto tar v2.8.3 no funciona de manera consistente en todas las plataformas (SO).-C
Se dice que la opción agrega un directorio al archivo, pero en Mac y Ubuntu agrega el prefijo de ruta absoluta dentro del archivo tar.gz generado.Por lo tanto, la solución consistente y robusta es
cd
ingresar a source_path (directorio padre de source_dir) y ejecutaro
en tu guion Esto eliminará el prefijo de ruta absoluta en la estructura de directorio de su archivo tar.gz generado.
fuente
-cvf
agregado despuéstar
), encuentro que el archivo tar.gz resultante no tiene rutas absolutas dentro de él, lo que es consistente con varias otras respuestas. Si cree que el alquitrán está roto o desactualizado en los dos sistemas que he usado para las pruebas, enlace a alguna documentación que respalde su respuesta. Creo que la-C
opción cambia el directorio antes de ejecutar (como en otras respuestas). Cuando lo omito, tar intenta agregar basura desde./
, incluidas las rutas de inicio./
.cd
primero. Su respuesta dice que la herramienta funciona de la manera opuesta a cómo los documentos dicen que funciona y cómo funciona en mi sistema, por lo que es una respuesta incorrecta. Podrías arreglarlo fácilmente.El siguiente comando creará un directorio raíz "." y poner todos los archivos del directorio especificado en él.
Si desea colocar todos los archivos en la raíz del archivo tar, @chinthaka está en lo cierto. Simplemente cd en el directorio y hacer:
Esto colocará todos los archivos en el cwd en el archivo tar como archivos raíz.
fuente
Usar el "punto" lleva a la creación de una carpeta llamada "punto" (en Ubuntu 16).
Me ocupé de esto con más detalle y preparé un ejemplo. Grabación multilínea, más una excepción.
fuente
.
, que es el directorio actual. En el contexto de latar.gz
estructura de 's, eso es solo el nivel base / raíz / superior, ¿verdad?Si desea archivar un subdirectorio y recortar la ruta del subdirectorio, este comando será útil:
fuente