用管道输送进出tar和gzip


11

我正在尝试掌握如何将命令从管道传输到gzip,cpio或tar之类的内容。

有问题的命令属于ZFS系统。我在Ubuntu Linux 10.04.3。上运行ZFS。

我正在使用的命令是;

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

这些部分我了解。

但是我的第一个问题是,如何处理tar + gzip?

这个?

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

我的另一个问题是如何从tarball或gzip中获取数据?

我必须用 zfs recieve media/mypictures@20070607 < ~/backups/20070607

如果我使用的是tar,那就是这个吗?

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

任何的想法?

Answers:


10

tar期望得到一个文件名列表作为命令行参数。据我所知,它不能用于读取匿名管道(它将存储为文件名和文件元数据吗?)

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

如果您的数据是单个逻辑项或流,则无需使用诸如tar之类的东西,它用于将一组单独的文件组合在一起。

否则,您将必须先将数据写入文件,然后将其压缩,然后删除该文件。


真?尽管tar只是压缩的另一种形式。因此,跳过tar而只使用gzip吗?
ianc1215 2011年

3
是的,只需使用zfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz
RedGrittyBrick 2011年

2
除非您指定-f选项,否则Tar不会期望文件名列表(tar也接受f不带“-”的文件)。
drevicko '16

1
@drevicko:问题的上下文是创建tar存档。我的意思是文件列表是要包含在书面存档中的文件(和/或目录)列表。例如:cd /etc; TAPE=/tmp/rgb.tar tar c hosts passwd文件列表为hosts passwd
RedGrittyBrick

2
@RedGrittyBrick,但是问题的上下文是从管道到tar,即:没有文件列表。说tar期望文件列表不正确。问题在于,当OP指定时,它期望一个(单个)输出文件名f,而他没有提供它。
drevicko '16

10

-f选项指定一个文件,否则输出进入stdout。因此,要么删除重定向:

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

或删除f选项:

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

同样具有不松懈的作用。


这真的有效吗?无论echo "hello" | tar czvf foo.tar.gzecho "hello" | tar czv > foo.tar.gz失败对我来说。
425nesp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.