lascia che tar rilevi automaticamente il tipo di compressione durante l'estrazione dallo stdin


16

Uso GNU tar. Può rilevare automaticamente il tipo di compressione durante la compressione / decompressione dei file. Ma devo decomprimere un archivio da stdin e il tipo di compressione non è noto. Ho notato che tar può darmi suggerimenti corretti come:

tar: Archive is compressed. Use -z option

Ma voglio che Tar usi automaticamente quell'opzione di compressione senza chiedermi di inserire quell'argomento. Come posso fare ciò? Perché non tar semplicemente decomprimere poiché conosce già il tipo di compressione?

Grazie!


Non è stato difficile svilupparsi, ma non è stato fatto fino ad ora.
Peter - Ripristina Monica il

3
La ragione per cui non può farlo è che tarnon sa quale tipo di dati ha stdinfino a quando non lo legge, e ormai è troppo tardi per chiamare il programma decompresso. Supporta gzip, bzip2 e altri. Risolvere questo problema non è facile (dovrebbe bufferizzare i dati), quindi ti dice solo di riprovare.
Kevin Panko,

@KevinPanko Perché dove è troppo tardi? No, non è tardi. Legge il primo 4K in un buffer, ne verifica il tipo di compressione (se presente), quindi chiama il programma. Questo buffering era composto da 10-20 righe di codice C aggiuntivo.
Peter - Ripristina Monica il

2
In quel momento in cui sa quali dati ha, non può più usare un metodo fork()/ semplice exec()per reindirizzare i dati attraverso un'utilità di decompressione. L'utilità leggeva dalla stdinpipe e ora mancava il primo 4K. Non è possibile rimettere i dati nella pipe dopo averli letti.
Kevin Panko,

3
@KevinPanko: Si potrebbe fare biforcendo due processi, facendo sostanzialmente l'equivalente di cat buffer - | gunzip. (In alternativa, è possibile utilizzare l'I / O non bloccante per evitare la necessità di un processo aggiuntivo.)
Ilmari Karonen,

Risposte:


10

Questa non è la risposta che vuoi sentire, ma non è supportata da GNU tar secondo il suo manuale:

L'unico caso in cui è necessario specificare un'opzione di decompressione durante la lettura dell'archivio è quando si legge da una pipe o da un'unità nastro che non supporta l'accesso casuale. Tuttavia, in questo caso GNU tar indicherà quale opzione dovresti usare. Per esempio:

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

Se vedi tale diagnostica, aggiungi semplicemente l'opzione suggerita all'invocazione di GNU tar:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 Creazione e lettura di archivi compressi


2
Nota che funziona nel comando tar su OSX ma non su Linux usando GNU tar. Quindi questo potrebbe essere risolto.
Sean Perry,

8

Infine, ho capito che il motivo per cui non posso permettere a tar di rilevare e decomprimere l'archivio da stdin è che uso GNU tar. Il tar BSD può farlo automaticamente senza problemi. Quindi decido di usare bsdtar invece di tar nel mio script ora.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.