O que estou procurando é uma maneira de passar dados arbitrários através do STDIN e fazer com que ele seja tarado como se fosse um arquivo normal.
eu tentei isso
$ echo test | tar -cf test.tar /dev/stdin
e isso me dá um test.tar
arquivo com o conteúdo dev/stdin
. O stdin
arquivo é um link para /proc/self/fd/0
.
O que eu quero é que dev/stdin
dentro do arquivo TAR seja um arquivo regular com o texto test
dentro. Algo semelhante acontece com:
$ tar -cf test.tar <(echo test)
mas os nomes são diferentes.
Isso é factível?
Acho que você não pode fazer o que quer aqui. O problema com sua abordagem é que
tar
lida com arquivos e árvores de diretórios, que você não está fornecendo com comandos como este:Mesmo quando você tenta "empacotar" suas strings em arquivos temporários usando subshells como este:
Você pode ver que seu conteúdo ainda está sendo TAR usando estes descritores de arquivos temporários:
Se sua intenção é apenas compactar strings, você precisa colocá-las em um contexto de arquivo. Então você precisaria fazer algo assim:
Você pode ver o presente do arquivo dentro do arquivo TAR:
Replicando dados usando tar
A maioria dos que trabalham com Unix há vários anos provavelmente terão visto esse padrão:
Eu costumava usar isso o tempo todo para replicar dados de um local para outro. Você pode usar isso sobre SSH também. Outros métodos são discutidos neste U&L Q&A intitulado: clone root directory tree using busybox .
Fazendo backup /
Há também este método se você pretende fazer backup de todo o disco rígido:
Referências
Você pode criar um arquivo tar como um fluxo se souber o tamanho final do que deseja transmitir (em bytes). É então uma questão de criar o cabeçalho inicial de 512 bytes antes do fluxo de dados e um preenchimento à direita depois dele. Embora dependa da variante exata do
tar
arquivo, pois existem alguns formatos de arquivo diferentes. As etapas a seguir podem funcionar para você:crie um arquivo de furo do mesmo tamanho que o fluxo de dados
$ dd if=/dev/zero of=mystream bs=1 count=0 seek=$SIZE
Observe que
mystream
agora é um arquivo "buraco" que na verdade não ocupa espaço em disco, embora pareça ter o mesmo tamanho, $SIZE, que o fluxo de dados.use
tar
para criar um cabeçalho para um arquivo chamadomystream
desse tamanho$ tar cf - mystream | head -c 512 > header
Note que
tar
vai querer criar um arquivo sem buraco, por isso é importante descartar tudo, exceto os primeiros 512 bytes. Em seguida, remova o arquivo de furo, para evitar que ele seja copiado acidentalmente.$ rm mystream
crie um trailer de preenchimento para preencher um número de 512 blocos.
$ head -c $((echo "scale=0; 512 - $SIZE % 512" | bc )) > trailer
faça o fluxo tar de $STREAM (de tamanho $SIZE) com cabeçalho e trailer
$ cat header $STREAM trailer
Observe que você provavelmente deseja transmitir isso para algo diferente de stdout.
Com
zsh
, você pode usar a=(...)
forma de substituição de processo que usa um arquivo temporário em vez de um pipe.tar
Com a opção do GNU--transform
, você pode alterar o nome do membro do arquivo:Criaria um
file.tar.gz
com umtest-file
membro com permissões 0600 e conteúdotest\n
.Com
bash
(ouzsh
), você poderia fazer:Here-strings também usam arquivos temporários nesses shells. Observe, no entanto, que a substituição de comando remove cada caractere de nova linha à direita e adiciona um de volta e
bash
removeria os bytes NUL.