laissez tar détecter automatiquement le type de compression lors de l'extraction à partir de stdin

16

J'utilise GNU tar. Il peut détecter automatiquement le type de compression lors de la compression / décompression de fichiers. Mais j'ai besoin de décompresser une archive de stdin et le type de compression est inconnu. J'ai remarqué que le goudron peut me donner des suggestions correctes comme:

tar: Archive is compressed. Use -z option

Mais je veux que tar utilise automatiquement cette option de compression sans me demander de saisir cet argument. Comment puis je faire ça? Pourquoi ne pas simplement décompresser tar car il connaît déjà le type de compression?

Je vous remercie!

James
la source
Ce n'était pas difficile à développer, mais ce n'est pas fait jusqu'à présent.
peterh - Réintégrer Monica
3
La raison pour laquelle il ne peut pas le faire est qu'il tarne sait pas sur quel type de données il se trouve stdinjusqu'à ce qu'il le lise et qu'il soit alors trop tard pour appeler le programme de décompression. Il prend en charge gzip, bzip2 et autres. Il n'est pas facile de contourner ce problème (il faudrait mettre les données en mémoire tampon), donc il vous dit simplement de réessayer.
Kevin Panko
@KevinPanko Pourquoi où est-il trop tard? Non, il n'est pas tard. Il lit par exemple le premier 4K dans un tampon, teste son type de compression (s'il y en a un), puis appelle le programme. Cette mise en mémoire tampon comprenait 10 à 20 lignes de code C supplémentaire.
peterh
2
À ce moment où il sait de quelles données il dispose, il ne peut plus utiliser une méthode simple fork()/ exec()pour diriger les données via un utilitaire de décompression. L'utilitaire lirait à partir du stdintuyau et le premier 4K serait désormais manquant. Il n'y a aucun moyen de remettre les données dans le tuyau après les avoir lues.
Kevin Panko
3
@KevinPanko: Cela pourrait être fait en forçant deux processus, cependant, en faisant essentiellement l'équivalent de cat buffer - | gunzip. (Alternativement, des E / S non bloquantes pourraient être utilisées pour éviter la nécessité d'un processus supplémentaire.)
Ilmari Karonen

Réponses:

10

Ce n'est pas la réponse que vous voulez entendre, mais cela n'est pas pris en charge par GNU tar selon son manuel:

Le seul cas où vous devez spécifier une option de décompression lors de la lecture de l'archive est lors de la lecture à partir d'un canal ou d'un lecteur de bande qui ne prend pas en charge l'accès aléatoire. Cependant, dans ce cas, GNU tar indiquera quelle option vous devez utiliser. Par exemple:

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

Si vous voyez de tels diagnostics, ajoutez simplement l'option suggérée à l'invocation de GNU tar:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 Création et lecture d'archives compressées

Kevin Panko
la source
2
Notez que cela fonctionne dans la commande tar sur OSX mais pas sur Linux utilisant GNU tar. Cela pourrait donc être corrigé.
Sean Perry
8

Enfin, j'ai réalisé que je ne peux pas laisser tar détecter et décompresser l'archive de stdin parce que j'utilise GNU tar. Le tar BSD peut le faire automatiquement sans problème. Je décide donc d'utiliser bsdtar au lieu de tar dans mon script maintenant.

James
la source