Considere un único archivo tar de un sistema externo que contiene algunos directorios con varios atributos que quiero conservar, como permisos, mtimes, etc. ¿Cómo puedo tomar fácilmente un subconjunto de estos archivos como usuario normal (no root)?
Buscando algo como:
tar -f some.tar.gz --subset subdir/ | ssh remote@system tar xvz
También es esencial que se conserven los atributos principales (propiedad, grupo, modo, mtime) en este archivo tar. ¿Qué pasa con otros atributos en un archivo tar, como palabras clave de encabezado extendido ?
Puntos de bonificación para una solución que evita el uso de un directorio temporal en caso de que este subdirectorio contenga archivos enormes.
@original.tar
enfoque era posible con bsdtar. Parece funcionar también con atributos extendidos y compresión</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(y, por alguna razón, una selección vacía produce una serie de cero bytes, pero eso no es un problema importante para mí).s/old/new/
no funciona en archivos que provienen de archivos antiguos usando @ old.tgz, solo funciona en archivos reales, archivando directamente desde el sistema de archivos. Realmente es una pena, ya que sería el caso de uso más útil para mí.La forma más fácil sería copiar todo el archivo; Supongo que no quieres hacer eso porque es demasiado grande.
Las herramientas de línea de comandos habituales (
tar
,pax
) no admiten copiar miembros de un archivo a otro archivo.Si no necesita preservar la propiedad, le sugiero que use los sistemas de archivos FUSE . Puede usar archivemount para montar un archivo como sistema de archivos; haga esto para el archivo fuente y ejecute tar en el sistema de archivos montado.
Alternativamente, puede usar AVFS :
Alternativamente, puede ejecutar
tar
el archivo original y extraerlo a la máquina remota a través de SSHFS .Sin embargo, todos estos métodos son engorrosos si necesita preservar la propiedad. Todos implican extraer a un archivo en la máquina local, por lo que la propiedad de este archivo tendrá que ser la propiedad remota prevista . Esto requiere ejecutarse como root y puede no dar el resultado deseado si los archivos son propiedad de cuentas que tienen nombres o ID que difieren entre la máquina local y el host remoto.
La
tarfile
biblioteca de Python proporciona una forma bastante fácil de manipular miembros tar, por lo que puede barajarlos de un archivo tar a otro. Admite formatos estándar POSIX (ustar, pax), así como algunas extensiones GNU. Aquí hay un script Python no probado que lee un archivo tar (posiblemente comprimido con gzip o bzip2) en su entrada estándar y escribe un archivo tar comprimido con bzip2 en su salida estándar. Los miembros de la fuente se copian si comienzan con el argumento pasado al script.Para ser invocado como
fuente
Un enfoque alternativo sin privilegios es usar el
fakeroot
programa para fingir que se le permite cambiar la propiedad. Mientras que otros atributos tar se pierden, mantiene el modo, mtime y uid / gid. Estos comandos crean un directorio temporal, extraen un subconjunto de los archivos y finalmente crean un nuevo archivo:fuente
GNU
tar
tiene una--delete
opción:De esta manera, puede obtener un subconjunto del tar de entrada especificando qué no incluir en la salida.
Desafortunadamente, no pude obtener la
--exclude
opción para trabajar--delete
, por lo que parece que primero necesita obtener una lista explícita (-t
) de cosas para eliminar y luego pasarla a otra invocacióntar
.O puede almacenar la lista en un archivo externo si es demasiado larga o compleja:
fuente
Por lo que sé, el
tar
comando no puede usar el formato tar tanto como entrada como salida. Tendrá que extraer sus archivos localmente de alguna manera, y usar tar nuevamente para crear un archivo tar-on-the-fly, con algo como esto (el-
medio de entrada / salida estándar se usa en lugar de un archivo):Tenga en cuenta que
tar
poder extraer un archivo tar directamente en otro archivo tar es una idea interesante ...fuente