Criando um archive tar sem incluir o diretório pai quando os arquivos são armazenados em diretórios diferentes

11

Eu tenho os quatro arquivos a seguir no sistema de arquivos:

/home/martin/cvs/ops/cisco/b/s1
/home/martin/cvs/ops/cisco/b/s2
/home/martin/cvs/ops/extreme/b/r3
/home/martin/cvs/ops/j/b/r5

Preciso colocar esses arquivos em um arquivo tar, mas não quero adicionar diretórios. O melhor que pude sugerir foi:

tar -C ~/cvs/ops/ -czvf archive.tgz cisco/b/s1 cisco/b/s2 extreme/b/r3 j/b/r5

Isso ainda não é perfeito, porque cada arquivo no arquivo morto tem dois diretórios. Existe uma maneira melhor? Ou eu simplesmente tem que copiar s1, s2, r3e r5arquivos em um diretório e criar o arquivo com tar -czvf archive.tgz s1 s2 r3 r5?

Martin
fonte

Respostas:

17

Você pode usar -Cvárias vezes (movendo-se de um diretório para outro):

tar czvf archive.tar.gz -C /home/martin/cvs/ops/cisco/b s1 s2 -C ../../extreme/b r3 -C ../../j/b r5

Observe que cada -Copção é interpretada em relação ao diretório atual nesse ponto (ou você pode simplesmente usar caminhos absolutos).

Stephen Kitt
fonte
11

Se você possui a lista de arquivos em um arquivo ou pode gerá-los usando um comando, pode usar um único comando tar do GNU:

tar cf foo.tar -T list-of-files --transform 's:.*/::'

A transformação ainda mantém os diretórios, mas nivela completamente o layout. Então você precisa de alguma maneira de filtrar diretórios, daí a necessidade de uma lista de arquivos.

muru
fonte
8

Você pode anexar arquivos ao arquivo, um por um:

tar cf /tmp/archive.tar -C /home/martin/cvs/ops/cisco/b s1
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/cisco/b s2
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/extreme/b r3
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/j/b r5

Você pode criar um script para facilitar: para cada caminho, execute tar rfo diretório base como o valor do -Cparâmetro e o nome do arquivo base sem o caminho a ser adicionado.

janos
fonte