Prefixar prefixo no alcatrão

15

Atualmente, faço em um shellscript muito ineficientemente:

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

Eu quero que tudo esteja contido no diretório chamado $ VERSION - existe uma maneira de fazer isso sem ter que copiar tudo como no script acima?

Robby75
fonte
Por que copiá-lo em primeiro lugar? Por que não tar cjf archive.tar.bz2 $MYPATH?
Chewie
1
@Chewie ele disse, ele quer a versão $ como dir principal no arquivo.
Kent
Oh, eu vejo agora.
Chewie

Respostas:

24

A versão GNU do tarsuporta a --transformopção (e seu alias --xform), você pode usá-lo assim

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

Por exemplo, dada essa árvore de diretórios

foo
└── foo.txt

o comando

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

irá produzir um arquivo como

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt
toro2k
fonte
3
Vale ressaltar que essa abordagem pode quebrar vínculos simbólicos. A adição antecipada flags=r;resolve o problema conforme mencionado em stackoverflow.com/a/29661783/388803 .
eregon
não inclua uma barra final; quando coloco uma barra final na transformação, o prefixo original é perdido; por exemplo s/^a\//b\//, o tar -tstill mostra a/enquanto todos os outros arquivos estão em baixo b/; Suponho que isso seja perigoso e realmente não preciso me proteger contra outro arquivo com o mesmo prefixo que não seja um diretório no arquivo tar; portanto, nenhuma barra final é boa, não me importo de saber a melhor maneira de lidar com o caso de a/ser transformado, mas não aa/se fosse um irmão do nó raiz.
ThorSummoner
14

Para tar o diretório atual e adicionar um prefixo, isso funcionou para mim:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .
Andy Balaam
fonte
0

Se você puder fugir sem preservar os links simbólicos na árvore de arquivos que você está tarrando, poderá fazer

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

A hopção significa links simbólicos de desreferência, ou seja, inclui o arquivo ou diretório ao qual o link aponta, em vez de simplesmente registrar o fato de que havia um link simbólico e o que ele apontava.

Ian Roberts
fonte