Considere um único arquivo tar de um sistema externo que contém alguns diretórios com vários atributos que eu quero manter, como permissões, mtimes etc. Como posso facilmente pegar um subconjunto desses arquivos como um usuário comum (não root)?
Procurando algo como:
tar -f some.tar.gz --subset subdir/ | ssh remote@system tar xvz
Também é essencial que os principais atributos (propriedade, grupo, modo, mtime) nesse arquivo tar sejam mantidos. E quanto a outros atributos em um arquivo tar, como palavras-chave de cabeçalho estendidas ?
Pontos de bônus para uma solução que evita o uso de um diretório temporário, caso esse subdiretório contenha arquivos enormes.
@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).s/old/new/
não funciona em arquivos provenientes de arquivos antigos usando @ old.tgz, funciona apenas em arquivos reais, arquivando diretamente no sistema de arquivos. É realmente uma pena, pois seria o caso de uso mais útil para mim.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.
Como alternativa, você pode usar o AVFS :
Como alternativa, você pode executar
tar
no arquivo original e extrair para a máquina remota pelo SSHFS .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.Para ser invocado como
fonte
Uma abordagem alternativa sem privilégios é usar o
fakeroot
programa para fingir que você tem permissão para alterar a propriedade. Enquanto outros atributos tar são perdidos, ele mantém o modo, mtime e uid / gid. Esses comandos criam um diretório temporário, extraem um subconjunto dos arquivos e finalmente criam um novo arquivo morto:fonte
O GNU
tar
tem uma--delete
opção:Dessa forma, você pode obter um subconjunto do tar de entrada especificando o que não incluir na saída.
Infelizmente, não consegui
--exclude
trabalhar com a opção--delete
, então parece que você precisa primeiro obter uma lista explícita (-t
) de itens a serem excluídos e depois passá-la para outra chamada detar
.Ou você pode armazenar a lista em um arquivo externo, se for muito longo ou complexo:
fonte
Pelo que eu sei, o
tar
comando não pode usar o formato tar tanto como entrada e saída. Você precisará extrair seus arquivos localmente de alguma forma e usar o tar novamente para criar um arquivo tar on-the-fly, com algo parecido com isto (o-
meio de entrada / saída padrão é usado em vez de um arquivo):Observe que ter
tar
a capacidade de extrair um arquivo tarfile diretamente em outro arquivo tarfile é uma ideia interessante ...fonte