Prefisso prefisso in tar


17

Attualmente lo faccio in uno shellscript in modo molto inefficiente:

cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION

Voglio che tutto sia contenuto nella directory chiamata $ VERSION - c'è un modo per farlo senza dover copiare tutto come nello script sopra?


Perché copiarlo in primo luogo? Perché no tar cjf archive.tar.bz2 $MYPATH?
Chewie,

2
@Chewie ha detto, vuole la versione $ come dir parent nell'archivio.
Kent,

Oh, lo vedo adesso.
Chewie,

Risposte:


26

La versione GNU di tarsupporta l' --transformopzione (e il suo alias --xform), è possibile utilizzarla in questo modo

tar --transform "s/^$MYPATH/$VERSION/" -cf archive.tar.bz2 "$MYPATH"

Ad esempio, dato questo albero di directory

foo
└── foo.txt

il comando

tar --transform "s/^foo/bar/" -cf foo.tar.bz2 foo

produrrà un archivio come

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt

3
È interessante notare che questo approccio potrebbe spezzare i collegamenti simbolici. La preparazione flags=r;risolve il problema come indicato in stackoverflow.com/a/29661783/388803 .
eregon,

non includere una barra finale; quando inserisco una barra finale nella trasformazione, il prefisso originale viene perso; ad esempio s/^a\//b\//, il tar -tfermo immagine viene visualizzato a/mentre tutti gli altri file sono sotto b/; Presumo che questo sia pericoloso e non ho davvero bisogno di proteggermi da qualche altro file con lo stesso prefisso che non è una directory nel file tar; quindi nessuna barra finale va bene, non mi dispiacerebbe sapere il modo migliore per gestire il caso della a/trasformazione, ma non aa/se fosse un fratello del nodo radice.
ThorSummoner,

15

Per tar la directory corrente e aggiungere un prefisso, questo ha funzionato per me:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .

0

Se riesci a scappare senza preservare i collegamenti simbolici all'interno dell'albero dei file che stai combattendo, potresti farlo

ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION

L' hopzione indica collegamenti simbolici di dereference, ovvero include il file o la directory a cui punta il collegamento anziché semplicemente registrare il fatto che esisteva un collegamento simbolico e ciò che indicava.


0

Per aggiungere un prefisso di directory in modo confortevole, utilizzare un separatore diverso da quello /in --transformdiscussione, ad esempio, +o ,come in risposta di Andy.

Quindi, per un caso più semplice, hai un sacco di file nella directory corrente e non vuoi creare un tarbomb .

tar czf logs_nightly.tar.gz --tranform 's+^+logs_nightly/+' *.log

La sintassi è s+search+replace+, e perché ^corrisponde semplicemente all'inizio del nome file.

E ora, solo per rispondere all'OP - beh, puoi evitare di copiare l'intera directory /tmpeseguendo:

mv $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION
mv $VERSION $MYPATH

In alternativa:

ln $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION

(hard link, evita problemi con i symlink)

Gli ultimi due sono stati inclusi per il valore dell'intrattenimento, io stesso mi atterrei alla risposta di toro2k.

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.