Trasforma i percorsi di un archivio tar senza estrarlo


10

GNU tar(1)ha un'opzione ordinata chiamata --transform. Dalla pagina man:

--transform, --xform EXPRESSION
usa sed sostitu EXPRESSION per trasformare i nomi dei file

Ciò consente la trasformazione al volo dei nomi dei percorsi mentre l'archivio viene estratto in modo da poter controllare dove e come verrà estratto.

La mia domanda è: esiste un modo per eseguire una trasformazione simile in situ ; cioè, senza estrarre l'archivio?

Esempio

[user@host]$ tar tf test.tar
./foo/blah  ./foo/bleh
[user@host]$ some_deep_magic 's/foo/bar/' test.tar
[user@host]$ tar tf test.tar
./bar/blah  ./bar/bleh

Caso d'uso

Sto distribuendo un tararchivio a utenti finali sostanzialmente all'oscuro e vorrei che si estraesse nel percorso corretto senza interferenze da parte mia. Sto cercando di evitare la banale soluzione di estrarre l'archivio, rinominare le directory e reimballare in quanto l'archivio è di grandi dimensioni.


Perché non trasformi i nomi durante la creazione?
Jose Luis Martin,

@JoseLuisMartin Right. Il mio caso d'uso è che l'archivio è già lì e, come ho detto, vorrei evitare di disimballare, trasformare e reimballare.
Joseph R.

1
È possibile modificare il flusso tar senza effettivamente
estrarlo

Risposte:


3

È possibile montare l'archivio con archivemount o mountavfs e ricrearlo di nuovo

archivemount tarfile.tar /mnt
cd /mnt
tar cf /tmp/tarfile.tar --transform 's/foo/bar/' .

le operazioni di scrittura sul filesystem di archivio eseguiranno una riscrittura completa su umount, quindi non sembra una buona opzione per file di grandi dimensioni.

MODIFICARE

Non conosco i dettagli dell'implementazione ma sembra che stiamo salvando i file di scrittura nel passaggio del file system.

Basta provare per risolvere i tizi, (su un catrame di mio / usr)

#!/bin/bash

# try to avoid slab cache issues 
cat /tmp/usr.tar > /dev/null

T="$(date +%s)"
tar xf /tmp/usr.tar
tar cf usr.tar usr --transform 's/usr/foo/'
T="$(($(date +%s)-T))"
echo "Tar/Untar seconds: ${T}"

T="$(date +%s)"
archivemount -o readonly -o nobackup /tmp/usr.tar /mnt
tar cf usr.tar /mnt  --transform 's/usr/foo/'
umount /mnt
T="$(($(date +%s)-T))"
echo "Archivemount seconds: ${T}"

T="$(date +%s)"
mountavfs
cd '/root/.avfs/tmp/usr.tar#'
tar cf /tmp/test/usr.tar   --transform 's/usr/foo/' .
T="$(($(date +%s)-T))"
echo "Avfs seconds: ${T}"

Produzione:

Tar/Untar seconds: 480
Archivemount seconds:  failure, a lot of read errors.
Avfs seconds: 217

Quindi vince Avfs! .


1
+1 Nuovo comando interessante. Ma in che modo questo approccio è diverso dalla decompressione dell'archivio? Non sto parlando dell'implementazione, ma delle prestazioni.
Joseph R.
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.