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=myfifoaus - Wenn
ddentfernen 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
tailzu 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.