Estoy creando un archivo tar usando la -P
bandera, lo que significa que todas las rutas son absolutas (el inicio /
no se elimina de los nombres de los archivos). Lo uso porque estoy guardando varios directorios y necesito que cada archivo se extraiga a su ubicación correcta.
Estoy usando un script para extraer el archivo tar y necesito poder extraer los archivos a otro directorio si se proporciona un argumento opcional.
Creo el archivo tar así:
tar pcjfPv "${ARCHIVE_NAME}".tmp.bz ${DIR_A} ${DIR_B}
${DIR_A}
es /path/a
y ${DIR_B}
es /path/b
.
Si ejecuto el script de extracción sin argumentos, espero que los archivos vayan a sus directorios correctos. Esta parte funciona como se esperaba con tar mxfvjpP
.
Sin embargo, cuando el script recibe una ruta en el argumento, quiero extraer los archivos a /path/from/argument/path/a
y /path/from/argument/path/b
.
¿Es esto siquiera posible? Esto es lo que tengo actualmente:
if [ ! -d "${EXTRACT_TO}" ]; then
echo "${EXTRACT_TO} does not exist, creating."
mkdir -p ${EXTRACT_TO}
fi
tar mxfvjP - -C ${EXTRACT_TO}
Eso no funciona. Se crea la ruta ${EXTRACT_TO}
, pero los archivos aún se extraen a /path/a
y /path/b
.
NOTA: No puedo modificar el archivo tar.
Respuesta1
En mi Debian extrayendosin -P
rendimientos Removing leading '/' from member names
. Quizás todo lo que necesite es no usarlo -P
mientras extrae a otro directorio.
Si hay algún problema con el enfoque anterior, considere --transform
. De man 1 tar
:
--transform=EXPRESSION
,--xform=EXPRESSION
Utilicesed
reemplazarEXPRESSION
para transformar nombres de archivos.
Así que esto
tar -x --transform='s|^/||' …
eliminará una barra diagonal inicial (si está allí) de cada ruta. Pero porque////foo
es equivalente a/foo
, lo siguiente parece mejor:
tar -x --transform='s|^/*||' …
Eliminará todas las barras diagonales iniciales.