Deje que el alquitrán detecte automáticamente el tipo de compresión al extraer de la entrada estándar

16

Yo uso GNU tar. Puede detectar automáticamente el tipo de compresión al comprimir / descomprimir archivos. Pero necesito descomprimir un archivo de stdin y se desconoce el tipo de compresión. Noté que el alquitrán me puede dar sugerencias correctas como:

tar: Archive is compressed. Use -z option

Pero quiero que tar use esa opción de compresión automáticamente sin pedirme que ingrese ese argumento. ¿Cómo puedo hacer eso? ¿Por qué no tar simplemente descomprime ya que ya conoce el tipo de compresión?

¡Gracias!

James
fuente
No fue difícil de desarrollar, pero no se ha hecho hasta ahora.
peterh - Restablece a Monica el
3
La razón por la que no puede hacer esto es que tarno sabe qué tipo de datos tiene stdinhasta después de leerlos, y para entonces es demasiado tarde para llamar al programa de descompresión. Es compatible con gzip, bzip2 y otros. Evitar este problema no es fácil (tendría que almacenar los datos en el búfer), por lo que solo le indica que intente nuevamente.
Kevin Panko
@KevinPanko ¿Por qué dónde es demasiado tarde? No, no es tarde. Lee el primer 4K en un búfer, prueba su tipo de compresión (si hay uno), luego llama al programa. Este almacenamiento en búfer fue de 10-20 líneas de código C adicional.
peterh - Restablece a Mónica el
2
En ese punto en el tiempo cuando se sabe qué datos tiene, ya no puede usar un simple fork()/ exec()método para canalizar los datos a través de una utilidad de descomprimir. La utilidad leería desde la stdintubería y ahora faltaría el primer 4K. No hay forma de volver a colocar los datos en la tubería después de leerlos.
Kevin Panko
3
@KevinPanko: Sin embargo, podría hacerse bifurcando dos procesos, básicamente haciendo el equivalente de cat buffer - | gunzip. (Alternativamente, las E / S sin bloqueo podrían usarse para evitar la necesidad del proceso adicional).
Ilmari Karonen

Respuestas:

10

Esta no es la respuesta que desea escuchar, pero GNU tar no lo admite de acuerdo con su manual:

El único caso cuando tiene que especificar una opción de descompresión mientras lee el archivo es cuando lee desde una tubería o desde una unidad de cinta que no admite acceso aleatorio. Sin embargo, en este caso, GNU tar indicará qué opción debe usar. Por ejemplo:

$ cat archive.tar.gz | tar tf -
tar: Archive is compressed.  Use -z option
tar: Error is not recoverable: exiting now

Si ve tales diagnósticos, simplemente agregue la opción sugerida a la invocación de GNU tar:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 Creación y lectura de archivos comprimidos

Kevin Panko
fuente
2
Tenga en cuenta que esto funciona en el comando tar en OSX pero no en Linux usando GNU tar. Entonces esto podría arreglarse.
Sean Perry
8

Finalmente, me di cuenta de que la razón por la que no puedo permitir que tar detecte y descomprima el archivo de stdin es que uso GNU tar. El tar de BSD puede hacerlo automáticamente sin problema. Entonces decido usar bsdtar en lugar de tar en mi script ahora.

James
fuente