Řekněme, že mám velký soubor s názvem foo.tar.xz
.
Rozdělil jsem soubor na části o velikosti těsně pod 4,7 GB pomocí split -b 4689887232 foo.tar.xz foo.tar.xz.
, což mi dává soubory s názvem foo.tar.xz.aa
, foo.tar.xz.ab
, atd.
Potom zapíšu každý soubor na jiné DVD a pošlu ho Alici pomocí poměrně velkého poštovního holuba.
Nyní mohla Alice vložit každé DVD, zkopírovat každý soubor do svého PC a pak použít cat
a xz
získat obsah foo
:cat foo.tar.xz.* | tar xfJ -
Nyní předpokládejme, že Alice má na svém počítači právě dostatek místa pro uložení extrahovaného obsahu foo
. Existuje nějaká příchuť cat
který bude číst tyto soubory přímo z DVD a pozastaví stream, aby jí umožnil vložit další DVD? Něco jako pausecat
nebo volumecat
?
Přijatá odpověď:
O takové cat
nevím příchuť, ale tady je řešení, které téměř funguje:
- V jednom terminálu spusťte
mkfifo myfifo; tail -c +1 -f myfifo | tar xfJ -
- Vložte první DVD do jednotky DVD-ROM (např. dev/sr0).
- V druhém terminálu spusťte
dd if=/dev/sr0 of=myfifo
- Když
dd
dokončí, vyjměte DVD. - Pokud máte jiný disk DVD, vložte jej do jednotky DVD-ROM a přejděte ke kroku 3, jinak přejděte ke kroku 6.
- V prvním terminálu stiskněte CTRL-C, abyste ukončili
tail
atar
.
Jak to funguje
Trik je v použití tail
nepřetržitě číst z pojmenované roury. Výstup tail
je pak přesměrován na příkaz, který chcete spustit. Zpočátku je potrubí neotevřené, takže se nic neděje. Ale když začnete čerpat data do potrubí pomocí dd
, tail
zvedne a předá vašemu příkazu.
Kouzlo se stane, když se tok dat do potrubí zastaví:tail
ponechává svůj standardní deskriptor souboru otevřený, což způsobí pozastavení příkazu. Mezitím tail
prostě čeká na další vstup.
Problém
Důvod, proč jsem řekl, že to téměř funguje, je ten, že se zdá, že došlo k problému s ukládáním do vyrovnávací paměti, který způsobuje tail
nezapsat poslední bit dat, který je do něj vložen. Doufám, že někdo může poskytnout přehled, jak to vyřešit.