Supposons que j'ai un gros fichier appelé foo.tar.xz
.
J'ai divisé le fichier en parties d'un peu moins de 4,7 Go chacune, en utilisant split -b 4689887232 foo.tar.xz foo.tar.xz.
, ce qui me donne des fichiers nommés foo.tar.xz.aa
, foo.tar.xz.ab
, etc.
Ensuite, j'écris chaque fichier sur un DVD différent et je l'envoie à Alice à l'aide d'un assez gros pigeon voyageur.
Maintenant, Alice pouvait insérer chaque DVD, copier chaque fichier sur son PC, puis utiliser cat
et xz
pour obtenir le contenu de foo
:cat foo.tar.xz.* | tar xfJ -
Supposons maintenant qu'Alice a juste assez d'espace sur son PC pour stocker le contenu extrait de foo
. Y a-t-il une saveur de cat
qui lira ces fichiers directement à partir des DVD et mettra le flux en pause pour lui permettre d'insérer le prochain DVD ? Quelque chose comme pausecat
ou volumecat
?
Réponse acceptée :
Je ne connais pas un tel cat
saveur, mais voici une solution qui presque fonctionne :
- Dans un terminal, exécutez
mkfifo myfifo; tail -c +1 -f myfifo | tar xfJ -
- Insérez le premier DVD dans le lecteur de DVD-ROM (ex. dev/sr0).
- Dans un deuxième terminal, exécutez
dd if=/dev/sr0 of=myfifo
- Quand
dd
terminé, retirez le DVD. - Si vous avez un autre DVD, insérez-le dans le lecteur de DVD-ROM et passez à l'étape 3, sinon passez à l'étape 6.
- Dans le premier terminal, appuyez sur CTRL-C pour tuer
tail
ettar
.
Comment ça marche
L'astuce consiste à utiliser tail
pour lire en continu à partir d'un tube nommé. La sortie de tail
est ensuite redirigé vers la commande que vous souhaitez exécuter. Initialement, le tuyau n'est pas ouvert, donc rien ne se passe. Mais lorsque vous commencez à pomper des données dans le tuyau avec dd
, tail
le récupère et le transmet à votre commandement.
La magie opère lorsque le flux de données vers le tube s'arrête :tail
garde son descripteur de fichier de sortie standard ouvert, ce qui entraîne la pause de votre commande. Pendant ce temps, tail
attend simplement plus d'entrées.
Le problème
La raison pour laquelle j'ai dit que cela fonctionnait presque est qu'il semble y avoir un problème de mise en mémoire tampon qui provoque tail
de ne pas écrire le dernier bit de données qui y est introduit. J'espère que quelqu'un pourra fournir les informations nécessaires pour résoudre ce problème.