Ein- und Auspfeifen von Teer und Gzip


11

Ich versuche herauszufinden, wie man von einem Befehl in etwas wie gzip, cpio oder tar leitet.

Die betreffenden Befehle gehören zum ZFS-System. Ich verwende ZFS unter Ubuntu Linux 10.04.3.

Die Befehle, mit denen ich arbeite, sind:

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

Diese Teile verstehe ich.

Aber meine erste Frage ist, was würde ich tun, um in tar + gzip zu pfeifen?

Diese?

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

Und meine andere Frage ist, wie ich die Daten aus dem Tarball oder GZIP herausholen kann.

Ich muss benutzen zfs recieve media/mypictures@20070607 < ~/backups/20070607

Wäre es nur so, wenn ich Teer verwenden würde?

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

Irgendeine Idee?

Antworten:


10

tarerwartet eine Liste von Dateinamen als Befehlszeilenargumente. Soweit ich weiß, kann es nicht zum Lesen einer anonymen Pipeline verwendet werden (was würde es als Dateiname und Dateimetadaten speichern?)

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

Wenn es sich bei Ihren Daten um ein einzelnes logisches Element oder einen einzelnen Stream handelt, müssen Sie beispielsweise tar nicht verwenden, um eine Reihe separater Dateien zu gruppieren.

Andernfalls müssen Sie die Daten zuerst in eine Datei schreiben, die Datei tarieren und dann die Datei löschen.


"Ja wirklich?" Ich dachte, Teer war nur eine andere Form der Kompression. Also Teer überspringen und einfach gzip?
ianc1215

3
Ja, benutze einfachzfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz
RedGrittyBrick

2
Tar erwartet KEINE Liste von Dateinamen, es sei denn, Sie geben die -fOption an (tar akzeptiert auch fohne das "-").
Drevicko

1
@drevicko: Der Kontext der Frage ist die Erstellung eines Teerarchivs. Die Liste der Dateien, die ich meine, ist die Liste der Dateien (und / oder Verzeichnisse), die in das schriftliche Archiv aufgenommen werden sollen. Zum Beispiel: cd /etc; TAPE=/tmp/rgb.tar tar c hosts passwdwo die Liste der Dateien isthosts passwd
RedGrittyBrick

2
@ RedGrittyBrick, aber der Kontext der Frage ist, aus einer Pipe zu tarieren, dh: keine Liste von Dateien. Zu sagen, dass tar erwartet, dass eine Liste von Dateien nicht wahr ist. Das Problem ist, dass es einen (einzelnen) Ausgabedateinamen erwartet, wenn das OP dies angibt f, und dass er ihn nicht angegeben hat.
Drevicko

10

Die -fOption gibt eine Datei an, andernfalls geht die Ausgabe an stdout. Lassen Sie also entweder die Umleitung fallen:

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

Oder lassen Sie die fOption fallen:

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

Ähnliches gilt für das Enteeren.


Funktioniert das eigentlich? Beides echo "hello" | tar czvf foo.tar.gzund echo "hello" | tar czv > foo.tar.gzscheitern für mich.
425nesp
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.