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?


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

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 .

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.