Rurowanie w tar i gzip

11

Próbuję zrozumieć, w jaki sposób przesyłać dane z polecenia do gzip, cpio lub tar.

Polecenia, o których mowa, należą do systemu ZFS. Używam ZFS na Ubuntu Linux 10.04.3.

Polecenia, z którymi pracuję to;

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

Te części rozumiem.

Ale moje pierwsze pytanie brzmi: co bym zrobił, aby potokować do tar + gzip?

To?

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

Moje drugie pytanie brzmi: jak mam pobrać dane z tarballa lub gzipa?

Muszę użyć zfs recieve media/mypictures@20070607 < ~/backups/20070607

Czy byłoby tak, gdybym używał smoły?

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

Dowolny pomysł?

ianc1215
źródło

Odpowiedzi:

10

taroczekuje, że otrzyma listę nazw plików jako argumenty wiersza poleceń. O ile mi wiadomo, nie można go używać do odczytywania anonimowego potoku (co zapisałby jako nazwę pliku i metadane pliku?)

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

Jeśli dane są pojedynczym logicznym elementem lub strumieniem, nie ma potrzeby używania czegoś takiego jak tar, który służy do grupowania zestawu oddzielnych plików.

W przeciwnym razie musisz najpierw zapisać dane w pliku, spakować plik, a następnie usunąć plik.

RedGrittyBrick
źródło
Naprawdę? Myślałem, że smoła jest po prostu inną formą kompresji. Więc pomiń tar i po prostu gzip?
ianc1215
3
Tak, po prostu użyjzfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz
RedGrittyBrick
2
Tar nie oczekuje listy nazw plików, chyba że podasz -fopcję (tar akceptuje również fbez „-”).
drevicko
1
@drevicko: Kontekstem pytania jest utworzenie archiwum tar. Mam na myśli listę plików, to listę plików (i / lub katalogów), które mają być zawarte w zapisanym archiwum. Na przykład: cd /etc; TAPE=/tmp/rgb.tar tar c hosts passwdgdzie znajduje się lista plikówhosts passwd
RedGrittyBrick
2
@RedGrittyBrick, ale kontekstem pytania jest tarowanie z potoku, tzn .: brak listy plików. Mówienie tar oczekuje, że lista plików nie jest prawdziwa. Problem polega na tym, że oczekuje nazwy (pojedynczego) pliku wyjściowego, gdy określa ją OP f, i nie podał jej.
drevicko
10

-fOpcja określa plik, w przeciwnym wypadku wyjście idzie do stdout. Więc upuść przekierowanie:

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

Lub upuść fopcję:

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

Podobnie z rozpakowaniem.

Piskvor opuścił budynek
źródło
Czy to naprawdę działa? Oba echo "hello" | tar czvf foo.tar.gzi echo "hello" | tar czv > foo.tar.gzdla mnie zawodzą.
425nesp