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
.
shell-script
tar
archive
Ramji
fuente
fuente
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ándarfuente
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 laman
, 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
fuente
Esto es simple como
Este truco de magia funciona si ha
lesspipe
instalado y si la variable envLESSOPEN
se define como lo| /usr/bin/lesspipe.sh %s
que se espera si tiene menos tubería instalada correctamente.fuente
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 untar
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íneasdd
y scripts de shell que podíantar
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 :... para separar un
tar
archivo sobre la marcha y realizar transformaciones en línea en sus archivos de texto componente. Allí loscut
campos apuntan a los campos 1,2,13 de una línea de entrada delimitada por NUL . Tales cosas son fáciles cuando eltar
archivo contiene solo archivos de texto porquetar
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í: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 deltar
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. Sinustar
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 elsize
campo de encabezado hasta que encuentre un miembro que coincida con el de que buscas Una vez allí, lea ensize
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 susize
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 ) , elsize
campo se especificará como cero.typeflag
campo está configurado para especificar un archivo de tipo 5 ( directorio ) , elsize
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
Sinchksum
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, elchksum
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?fuente
Puedes usar esta línea
fuente
y.txt
y no queda claro por la pregunta del OP que ese es el único archivo en el tar.