tar 和 gzip 的管道进出

ian*_*215 12 linux compression filesystems zfs

我正在尝试了解如何从命令通过管道传输到 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
Run Code Online (Sandbox Code Playgroud)

这些部分我理解。

但我的第一个问题是,我将如何通过管道输入 tar + gzip?

这个?

zfs send media/mypictures@20070607 | tar czvf > ~/backups/20070607.tar.gz
Run Code Online (Sandbox Code Playgroud)

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

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

那么如果我使用 tar 会不会是这样?

zfs recieve media/mypictures@20070607 | tar xzvf < ~/backups/20070607.tar.gz
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Red*_*ick 11

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

$ echo aaa | tar cv > f.tar
tar: Cowardly refusing to create an empty archive
Try `tar --help' for more information.
Run Code Online (Sandbox Code Playgroud)

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

否则,您必须先将数据写入文件,对文件进行 tar,然后再删除文件。

  • 是的,只需使用`zfs send media/mypictures@20070607 | gzip -c &gt; ~/backups/20070607.gz` (3认同)
  • 除非您指定 `-f` 选项(tar 也接受不带“-”的 `f`),否则 Tar 不需要文件名列表。 (2认同)
  • @RedGrittyBrick 但问题的上下文是从管道中提取 tar,即:没有文件列表。说 tar 需要文件列表是不正确的。问题在于,当 OP 指定 `f` 时,它需要一个(单个)输出文件名,而他没有提供。 (2认同)

Pis*_*ing 10

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

zfs send media/mypictures@20070607 | tar czvf ~/backups/20070607.tar.gz
Run Code Online (Sandbox Code Playgroud)

或删除f选项:

zfs send media/mypictures@20070607 | tar czv > ~/backups/20070607.tar.gz
Run Code Online (Sandbox Code Playgroud)

与解焦类似。

  • 这真的有效吗?两者都`回显“你好” | tar czvf foo.tar.gz` 和 `echo "hello" | tar czv ​​&gt; foo.tar.gz` 对我来说失败了。 (6认同)