Supponiamo di avere un file di grandi dimensioni chiamato foo.tar.xz
.
Ho diviso il file in parti di poco meno di 4,7 GB ciascuna, utilizzando split -b 4689887232 foo.tar.xz foo.tar.xz.
, che mi dà file chiamati foo.tar.xz.aa
, foo.tar.xz.ab
, ecc.
Quindi scrivo ogni file su un DVD diverso e lo mando ad Alice usando un piccione viaggiatore piuttosto grande.
Ora Alice potrebbe inserire ogni DVD, copiare ogni file sul suo PC e quindi usare cat
e xz
per ottenere il contenuto di foo
:cat foo.tar.xz.* | tar xfJ -
Ora supponi che Alice abbia abbastanza spazio sul suo PC per memorizzare i contenuti estratti di foo
. C'è qualche sapore di cat
che leggerà questi file direttamente dai DVD e metterà in pausa lo streaming per consentirle di inserire il DVD successivo? Qualcosa come pausecat
o volumecat
?
Risposta accettata:
Non conosco un simile cat
sapore, ma ecco una soluzione che quasi funziona:
- In un terminale esegui
mkfifo myfifo; tail -c +1 -f myfifo | tar xfJ -
- Inserisci il primo DVD nell'unità DVD-ROM (es. dev/sr0).
- In un secondo terminale esegui
dd if=/dev/sr0 of=myfifo
- Quando
dd
completa, rimuovi il DVD. - Se hai un altro DVD, inseriscilo nell'unità DVD-ROM e vai al passaggio 3, altrimenti vai al passaggio 6.
- Nel primo terminale, premi CTRL-C per uccidere
tail
etar
.
Come funziona
Il trucco è usare tail
per leggere continuamente da una named pipe. L'output di tail
viene quindi reindirizzato al comando che si desidera eseguire. Inizialmente il tubo non è aperto quindi non succede nulla. Ma quando inizi a pompare i dati nella pipe con dd
, tail
lo raccoglie e lo inoltra al tuo comando.
La magia avviene quando il flusso di dati alla pipe si interrompe:tail
mantiene aperto il suo descrittore di file standard, il che provoca la sospensione del comando. Nel frattempo, tail
attende semplicemente più input.
Il problema
Il motivo per cui ho detto che sta quasi funzionando è perché sembra esserci un problema di buffering che causa la tail
per non scrivere l'ultimo bit di dati che viene inserito in esso. La mia speranza è che qualcuno possa fornire le informazioni per affrontare questo problema.