Quiero ver el contenido del archivo alquitranado sin extraerlo. Escenario: tengo un.tar y dentro hay un archivo llamado ./x/y.txt
. Quiero ver el contenido de y.txt
sin extraer realmente el a.tar
.
Quiero ver el contenido del archivo alquitranado sin extraerlo. Escenario: tengo un.tar y dentro hay un archivo llamado ./x/y.txt
. Quiero ver el contenido de y.txt
sin extraer realmente el a.tar
.
Respuestas:
Probablemente sea una opción específica de GNU, pero podría usar -O
o --to-stdout
para extraer archivos a la salida estándar
$ tar -axf file.tgz foo/bar -O
tar -axf file.tar.gz --wildcards --no-anchored '*read_this_file*' --O
cuando, por ejemplo, muchos archivos coinciden *read_this_file*
. Todo se imprime en la misma línea. De la man
, que encontré --to-command
. así que pasar --to-command="echo '' && cat"
es un poco de magia negra pero funciona: D
$ tar -axf file.tgz foo/bar -O
Esto imprime el contenido de ./x/y.txt de a.tar a STDOUT.
tar xfO a.tar ./x/y.txt
Esto es simple como
less a.tar:./x/y.txt
Este truco de magia funciona si ha lesspipe
instalado y si la variable env LESSOPEN
se define como lo | /usr/bin/lesspipe.sh %s
que se espera si tiene menos tubería instalada correctamente.
lesspipe.sh
probablemente debería preferirse.
Ah, pero esta es una pregunta sobre el contenido de un archivo dentro de un tar
archivo. Y en realidad, en algunos casos esto no es tan difícil. La cuestión es que un tar
archivo es solo un archivo de flujo bloqueado: cada archivo dentro del archivo se encuentra después del anterior, y cada archivo obtiene un encabezado de metadatos basado en un formato específico .
Sobre la base de ese formato, una vez escribí shitar
, que consistía en unas pocas líneas dd
y scripts de shell que podían tar
generar una corriente de dispositivos de bloque sobre la marcha. Basado en lo mismo, más recientemente escribí estas pocas líneas de código :
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; } |
cut -d '' -f-2,13 |
tr '\0\n' '\n\t'
... para separar un tar
archivo sobre la marcha y realizar transformaciones en línea en sus archivos de texto componente. Allí los cut
campos apuntan a los campos 1,2,13 de una línea de entrada delimitada por NUL . Tales cosas son fáciles cuando el tar
archivo contiene solo archivos de texto porque tar
los delimitadores de registro (como puede ocurrir una vez cada 512 bytes) pueden reducirse a un solo NUL por unidad y eliminarse, sin requerir que cuente las ocurrencias como lo hace.
tar
El formato del encabezado se ve así:
field offset len
name 0 100
mode 100 8
uid 108 8
gid 116 8
size 124 12
mtime 136 12
chksum 148 8
typeflag 156 1
linkname 157 100
magic 257 6
version 263 2
uname 265 32
gname 297 32
devmajor 329 8
devminor 337 8
prefix 345 155
Comprenda que existe una fuerte pendiente entre la relativa facilidad de manejar tar
operaciones simples con los aspectos mucho más complicados del formato de archivo. Si bien las cosas simples, como agrupar un pequeño grupo de archivos tipeados de manera homogénea o incluso dividir un archivo que contiene solo miembros cuyos tipos se pueden predecir, se pueden hacer fácilmente con unas pocas tuberías, manejar de manera confiable miembros de archivos arbitrarios no es un asunto trivial.
Es especialmente difícil cuando esos miembros pueden contener datos binarios arbitrarios, lo que ciertamente excluiría cualquier aplicación confiable de tr -s
, y esta dificultad solo se agrava cuando se usan archivos de varios tipos que no sean regulares y / o charsets que no sean el nativo y / o el el archivo original fue creado por una implementación con idiosincrasias de aplicación de formato que no está preparado para manejar. Y esto solo toca los aspectos básicos y estandarizados del tar
tipo de archivo: agregue encabezados extendidos y extensiones de formato y archivos dispersos y compresión y ... bueno, buena suerte con ellos.
Sin embargo, volviendo a lo básico, el tamaño de registro estándar para un tar
archivo es de 20 bloques, o 10240 bytes. Sin ustar
embargo, dado un archivo bloqueado en el tamaño de registro estándar y que contiene solo tipos de archivo estándar y encabezados estándar , debe saltar del encabezado de miembro al encabezado de miembro haciendo lecturas de acuerdo con el size
campo de encabezado hasta que encuentre un miembro que coincida con el de que buscas Una vez allí, lea en size
bytes desde el desplazamiento que comienza en la cola del encabezado de miembro de su objetivo. Y ese es tu archivo.
Sin embargo, saltear los encabezados no es terriblemente fácil. Los diferentes tipos tendrán o no bloques de datos reales anexados que correspondan size
. Por ejemplo, los directorios y enlaces no contendrán dicho bloque de datos, solo una descripción del encabezado, por lo que debe estar preparado para verificar el tipo de archivo del encabezado actual antes de determinar exactamente si debe aplicar su size
campo a su fórmula de omisión o no.
Además, los factores de tamaño de registro , dependiendo de si los tamaños de los miembros del archivo se sincronizan bien con el tamaño de registro estándar 10240, puede haber o no un bloque 0 adicional agregado a cada uno. Y el tamaño del registro se puede declarar en el momento de la creación del archivo, por lo que es posible que ni siquiera tenga 20 bloques, aunque, por especificación, siempre debe estar bloqueado en unidades de 512 bytes:
tar
formato de intercambio; vea la sección DESCRIPCIÓN EXTENDIDA . El tamaño de bloque predeterminado para este formato para archivos de caracteres especiales será 10240 . Las implementaciones admitirán todos los valores de tamaño de bloque menores o iguales a 32256 que son múltiplos de 512 .Entonces, si estaba trabajando con un tar
archivo que podría contener archivos que podrían contener datos binarios arbitrarios, tendría que omitir el archivo algorítmicamente y de acuerdo con el tipo de archivo. La especificación dice:
size
campo es el tamaño del archivo en octetos.
typeflag
campo está configurado para especificar que un archivo sea de tipo 1 (un enlace ) o 2 (un enlace simbólico ) , el size
campo se especificará como cero.typeflag
campo está configurado para especificar un archivo de tipo 5 ( directorio ) , el size
campo se interpretará como se describe en la definición de ese tipo de registro.typeflag
campo se establece en 3 ( archivo especial de caracteres ) , 4 ( archivo especial de bloque ) o 6 ( FIFO ) , size
este volumen de POSIX.1-2008 no especifica el significado del campo y no se registrarán registros lógicos de datos almacenado en el medio.size
campo se ignorará al leer.typeflag
campo se establece en cualquier otro valor, el número de registros lógicos escritos después del encabezado será , ignorando cualquier fracción en el resultado de la división.( (
size
+ 511 ) / 512 )
... y, por supuesto, teniendo en cuenta también el tamaño individual de cada encabezado, que es un bloque adicional por miembro. Por lo tanto, puede pasar de una lectura a otra de encabezado a encabezado hasta que encuentre uno que coincida con el encabezado que busca, en ese momento deberá verificar si el registro actual simplemente describe un enlace a su archivo o al archivo real . Esto es especialmente relevante porque cuando el mismo archivo se agrega a un archivo varias veces, muchos tar
s solo incluirán encabezados de enlace porque los datos del archivo real ya se pueden encontrar en otras partes del archivo.
Después de verificar que necesitarás aplicar tus cálculos al chksum
campo y verificar que el archivo que crees que tienes es en realidad el archivo que deseas después de todo. tar
Sin chksum
embargo, es bastante simple:
chksum
campo será la representación IRV estándar ISO / IEC 646: 1991 del valor octal de la suma simple de todos los octetos en el registro lógico del encabezado. Cada octeto en el encabezado se tratará como un valor sin signo. Estos valores se agregarán a un entero sin signo, inicializado a cero, cuya precisión no sea inferior a 17 bits. Al calcular la suma de verificación, el chksum
campo se trata como si fuera todo <space> caracteres.Por supuesto, en realidad no tendría que hacer nada de eso, porque tar
ya puede hacerlo, eso es lo que hace, por lo que probablemente debería usarlo para buscar en el archivo y extraer el archivo por usted. Al hacerlo, no hará nada muy diferente de lo que haría si supiera de qué se trata, excepto que probablemente lo hará mejor y más rápido porque ese es su trabajo. Y de todos modos, ¿por qué deberías?