Digamos que tengo un archivo grande llamado foo.tar.xz
.
Dividí el archivo en partes de poco menos de 4,7 GB cada una, usando split -b 4689887232 foo.tar.xz foo.tar.xz.
, que me da archivos llamados foo.tar.xz.aa
, foo.tar.xz.ab
, etc.
Luego escribo cada archivo en un DVD diferente y se lo envío a Alice usando una paloma mensajera bastante grande.
Ahora Alice podría insertar cada DVD, copiar cada archivo a su PC y luego usar cat
y xz
para obtener el contenido de foo
:cat foo.tar.xz.* | tar xfJ -
Ahora suponga que Alice tiene suficiente espacio en su PC para almacenar los contenidos extraídos de foo
. ¿Hay algún sabor de cat
? que leerá estos archivos directamente desde los DVD y pausará la transmisión para permitirle insertar el siguiente DVD? Algo así como pausecat
o volumecat
?
Respuesta aceptada:
No conozco tal cat
sabor, pero aquí hay una solución que casi funciona:
- En una terminal, ejecute
mkfifo myfifo; tail -c +1 -f myfifo | tar xfJ -
- Inserte el primer DVD en la unidad de DVD-ROM (por ejemplo, dev/sr0).
- En una segunda terminal, ejecute
dd if=/dev/sr0 of=myfifo
- Cuando
dd
completa, extraiga el DVD. - Si tiene otro DVD, insértelo en la unidad de DVD-ROM y vaya al paso 3; de lo contrario, vaya al paso 6.
- En la primera terminal, presiona CTRL-C para matar a
tail
ytar
.
Cómo funciona
El truco es usar tail
para leer continuamente desde una canalización con nombre. La salida de tail
luego se canaliza al comando que desea ejecutar. Inicialmente, la tubería no está abierta, por lo que no sucede nada. Pero cuando comienzas a bombear datos a la tubería con dd
, tail
lo recoge y lo reenvía a su mando.
La magia ocurre cuando se detiene el flujo de datos a la tubería:tail
mantiene abierto su descriptor de archivo de salida estándar, lo que hace que su comando se detenga. Mientras tanto, tail
simplemente espera más información.
El problema
La razón por la que dije que casi funciona es porque parece haber un problema de almacenamiento en búfer que causa tail
no escribir el último bit de datos que se introduce en él. Mi esperanza es que alguien pueda proporcionar la información para abordar esto.