Angenommen, ich habe eine große Datei namens foo.tar.xz
.
Ich habe die Datei mit split -b 4689887232 foo.tar.xz foo.tar.xz.
in Teile von jeweils knapp 4,7 GB aufgeteilt , was mir Dateien mit dem Namen foo.tar.xz.aa
gibt , foo.tar.xz.ab
, etc.
Dann schreibe ich jede Datei auf eine andere DVD und schicke sie mit einer ziemlich großen Brieftaube an Alice.
Jetzt könnte Alice jede DVD einlegen, jede Datei auf ihren PC kopieren und dann cat
verwenden und xz
um den Inhalt von foo
zu erhalten :cat foo.tar.xz.* | tar xfJ -
Nehmen wir nun an, dass Alice gerade genug Speicherplatz auf ihrem PC hat, um den extrahierten Inhalt von foo
zu speichern . Gibt es eine Art cat
die diese Dateien direkt von DVDs liest und den Stream pausiert, damit ihr die nächste DVD einlegen könnt? Etwas wie pausecat
oder volumecat
?
Akzeptierte Antwort:
Ich kenne keine solche cat
Geschmack, aber hier ist eine Lösung, die fast funktioniert:
- Führen Sie in einem Terminal
mkfifo myfifo; tail -c +1 -f myfifo | tar xfJ -
- Legen Sie die erste DVD in das DVD-ROM-Laufwerk ein (z. B. dev/sr0).
- Führen Sie in einem zweiten Terminal
dd if=/dev/sr0 of=myfifo
aus - Wenn
dd
entfernen Sie die DVD. - Wenn Sie eine andere DVD haben, legen Sie sie in das DVD-ROM-Laufwerk ein und fahren Sie mit Schritt 3 fort, andernfalls fahren Sie mit Schritt 6 fort.
- Drücken Sie im ersten Terminal STRG-C, um
tail
zu beenden undtar
.
Wie es funktioniert
Der Trick besteht darin, tail
zu verwenden um kontinuierlich aus einer benannten Pipe zu lesen. Die Ausgabe von tail
wird dann an den Befehl weitergeleitet, den Sie ausführen möchten. Anfangs ist das Rohr ungeöffnet, also passiert nichts. Aber wenn Sie mit dd
beginnen, Daten in die Pipe zu pumpen , tail
holt es ab und leitet es an Ihren Befehl weiter.
Die Magie passiert, wenn der Datenfluss zur Pipe stoppt:tail
hält seinen standardmäßigen out-Dateideskriptor offen, was dazu führt, dass Ihr Befehl angehalten wird. In der Zwischenzeit tail
wartet einfach auf weitere Eingaben.
Das Problem
Der Grund, warum ich sagte, dass es fast funktioniert, ist, dass es anscheinend ein Pufferproblem gibt, das tail
verursacht nicht das letzte Datenbit zu schreiben, das darin eingespeist wird. Ich hoffe, dass jemand den Einblick geben kann, um dies anzugehen.