Piping in and out of tar and gzip
I am trying to get a handle on how to pipe from a command into something like gzip, cpio or tar.
The commands in question belong to the ZFS system. I am running ZFS on Ubuntu Linux 10.04.3.
The commands I working with are;
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
These parts I understand.
But my first question is, what would I do to pipe into tar + gzip?
This?
zfs send media/mypictures@20070607 | tar czvf > ~/backups/20070607.tar.gz
And my other question is how would I get the data out of the tarball or gzip?
I have to use zfs recieve media/mypictures@20070607 < ~/backups/20070607
So would it just be this if I was using tar?
zfs recieve media/mypictures@20070607 | tar xzvf < ~/backups/20070607.tar.gz
Any idea?
Solution 1:
tar
expects to be given a list of filenames as command line arguments. So far as I know, it cannot be used to read an anonymous pipeline (what would it store as filename and file-metadata?)
$ echo aaa | tar cv > f.tar
tar: Cowardly refusing to create an empty archive
Try `tar --help' for more information.
If your data is a single logical item or stream, there is no need to use something like tar, which is used to group together a set of separate files.
Otherwise you will have to write the data to a file first, tar the file, then delete the file.
Solution 2:
The -f
option specifies a file, else the output goes to stdout. So, either drop the redirection:
zfs send media/mypictures@20070607 | tar czvf ~/backups/20070607.tar.gz
Or drop the f
option:
zfs send media/mypictures@20070607 | tar czv > ~/backups/20070607.tar.gz
Similarly with untarring.