Especifica o diretório root dentro do tarball

7

Existe uma maneira de executar

tar cjvf foo.tar.bz2 project-root

Tal que quando o tarball é extraído, ele não extrai a raiz do projeto, mas extrai para outra coisa? ou seja,

tar xjvf foo.tar.bz2
cd something-else
# see all files that were within original project-root

Eu estou ciente do -C, mas eu quero isso de tal forma que algo mais não exista ainda.

    
por Pistos 20.01.2010 / 02:09

2 respostas

4

Crie um link simbólico primeiro e siga-o.

ln -s project-root something-else
tar cjf foo.tar.bz2 something-else/*
rm something-else

O /* é necessário para seguir o link e selecionar todo o conteúdo, em vez de simplesmente tarring o próprio link simbólico. Você poderia alternativamente usar a opção -h no GNU tar (mas isso também seguirá links dentro, o que você pode não querer fazer) ou a opção H no tar do BSD (como em um Mac).

Você pode até fazer isso de dentro do projeto-raiz:

cd project-root
ln -s . something-else
tar cjf foo.tar.bz2 --exclude=something-else/something-else something-else/*
rm something-else

A menos que você exclua explicitamente (como acima), o link simbólico também existirá no tarball.

Obviamente, se você estiver fazendo isso muitas vezes e não se importar com o link simbólico, não precisará ser excluído e recriado a cada vez.

    
por 09.01.2014 / 22:21
2

Você pode renomear raiz do projeto dentro do tarball com a GUI 7-zip (e provavelmente outros programas de arquivamento também), mas isso pode fazer um ciclo de recompressão-descompressão completo em tarballs compactados. (Leia: isso pode demorar um pouco em tarballs grandes e altamente compactados.)

A melhor maneira de fazer o que você quer é mudar o nome antes de criar o tarball. Uma maneira simples seria renomear temporariamente projeto-raiz para algo-else :

# temporary rename; tar; restore original name
$ mv project-root something-else ; tar cjf foo.tar.bz2 something-else ; mv something-else project-root

Eu provavelmente ficaria um pouco mais complicado: fazer uma cópia com o nome que eu quero no tarball. Isso evita erros em potencial ou etapas perdidas em qualquer processo que conserte depois, e eu posso querer manter ambas as cópias para outros propósitos.

# make me a copy
$ ( cd project-root ; tar cf - . ) | ( mkdir something-else; cd something-else; tar xf - )

# test the copy here if needed
$ diff -r --brief project-root/ something-else/

# create my tarball
$ tar cjf foo.tar.bz2 something-else
    
por 20.01.2010 / 03:41