Tubulação dentro e fora de alcatrão e gzip


11

Estou tentando entender como canalizar de um comando para algo como gzip, cpio ou tar.

Os comandos em questão pertencem ao sistema ZFS. Estou executando o ZFS no Ubuntu Linux 10.04.3.

Os comandos com os quais estou trabalhando são;

To create a snapshot;
zfs snapshot media/mypictures@20070607

To copy the snapshot to a directory;
zfs send media/mypictures@20070607 > ~/backups/20070607

Then I can also pipe into gzip
zfs send media/mypictures@20070607 | gzip > ~/backups/20070607.gz

Essas partes eu entendo.

Mas minha primeira pergunta é: o que eu faria para inserir no tar + gzip?

Este?

zfs send media/mypictures@20070607 | tar czvf > ~/backups/20070607.tar.gz

E minha outra pergunta é como eu tiraria os dados do tarball ou gzip?

Eu tenho que usar zfs recieve media/mypictures@20070607 < ~/backups/20070607

Então seria isso se eu estivesse usando alcatrão?

zfs recieve media/mypictures@20070607 | tar xzvf < ~/backups/20070607.tar.gz

Qualquer ideia?

Respostas:


10

tarespera receber uma lista de nomes de arquivos como argumentos de linha de comando. Até onde eu sei, ele não pode ser usado para ler um pipeline anônimo (o que armazenaria como nome de arquivo e metadados de arquivo?)

$ echo aaa | tar cv > f.tar
tar: Cowardly refusing to create an empty archive
Try `tar --help' for more information.

Se seus dados são um único item ou fluxo lógico, não há necessidade de usar algo como tar, que é usado para agrupar um conjunto de arquivos separados.

Caso contrário, você terá que gravar os dados em um arquivo primeiro, tar o arquivo e excluí-lo.


Mesmo? Eu pensei que o tar era apenas outra forma de compressão. Então pule tar e apenas gzip?
Ianc1215

3
Sim, é só usarzfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz
RedGrittyBrick

2
O Tar NÃO espera uma lista de nomes de arquivos, a menos que você especifique a -fopção (o tar também aceita fsem o "-").
drevicko

11
@drevicko: O contexto da pergunta está criando um arquivo tar. A lista de arquivos que eu quero dizer é a lista de arquivos (e / ou diretórios) a serem incluídos no arquivo gravado. Por exemplo: cd /etc; TAPE=/tmp/rgb.tar tar c hosts passwdonde está a lista de arquivoshosts passwd
RedGrittyBrick 02/02

2
@RedGrittyBrick, mas o contexto da pergunta é tar de um pipe, ou seja: nenhuma lista de arquivos. Dizer tar espera que uma lista de arquivos não seja verdadeira. O problema é que ele espera um nome de arquivo de saída (único) quando o OP especifica fe ele não o forneceu.
drevicko 02/02

10

A -fopção especifica um arquivo, caso contrário, a saída vai para stdout. Então, solte o redirecionamento:

zfs send media/mypictures@20070607 | tar czvf ~/backups/20070607.tar.gz

Ou largue a fopção:

zfs send media/mypictures@20070607 | tar czv > ~/backups/20070607.tar.gz

Da mesma forma com untarring.


Isso realmente funciona? Ambos echo "hello" | tar czvf foo.tar.gze echo "hello" | tar czv > foo.tar.gzfalham para mim.
425nesp
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.