A maneira mais fácil seria copiar todo o arquivo; Presumo que você não queira fazer isso porque é muito grande.
As ferramentas de linha de comando habituais ( tar
, pax
) não suportam a cópia de membros de um arquivo para outro arquivo.
Se você não precisou preservar a propriedade, sugiro o uso de sistemas de arquivos FUSE . Você pode usar o archivemount para montar um archive como um sistema de arquivos; faça isso no arquivo de origem e execute tar no sistema de arquivos montado.
archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt
Como alternativa, você pode usar o AVFS :
mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz
Como alternativa, você pode executar tar
no arquivo original e extrair para a máquina remota pelo SSHFS .
sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt
No entanto, todos esses métodos são complicados se você precisar preservar a propriedade. Todos eles envolvem a extração para um arquivo na máquina local; portanto, a propriedade desse arquivo deverá ser a propriedade remota pretendida . Isso requer a execução como raiz e pode não fornecer o resultado pretendido se os arquivos pertencerem a contas com nomes ou IDs que diferem entre a máquina local e o host remoto.
A tarfile
biblioteca do Python fornece uma maneira bastante fácil de manipular membros tar, para que você possa embaralhá-los de um arquivo tar para outro. Ele suporta os formatos padrão POSIX (ustar, pax), bem como algumas extensões GNU. Aqui está um script Python não testado que lê um arquivo tar (possivelmente compactado com gzip ou bzip2) em sua entrada padrão e grava um arquivo tar compactado com bzip2 em sua saída padrão. Os membros da fonte são copiados se começarem com o argumento passado para o script.
#!/usr/bin/env python2
import sys, tarfile
source = tarfile.open(fileobj=sys.stdin)
destination = tarfile.open(fileobj=sys.stdout, mode='w:bz2')
for info in source:
if info.name.startswith(sys.argv[1]):
destination.addfile(info)
destination.close()
Para ser invocado como
tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj
@original.tar
abordagem era possível com o bsdtar. Parece funcionar também com atributos estendidos e compactação</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(e por algum motivo uma seleção vazia produz uma série de zero bytes, mas isso não é um grande problema para mim).