分割和合并 - 使用 DVD!

分割和合并 - 使用 DVD!

假设我有一个名为 的大文件foo.tar.xz。我使用 将该文件分成每个大小不到 4.7GB 的部分,split -b 4689887232 foo.tar.xz foo.tar.xz.这给了我名为 、 等的文件foo.tar.xz.aafoo.tar.xz.ab然后我将每个文件写入不同的 DVD 并使用相当大的 DVD 将其发送给 Alice信鸽

现在 Alice 可以插入每张 DVD,将每个文件复制到她的 PC,然后使用catxz获取以下内容foocat foo.tar.xz.* | tar xfJ -

现在假设 Alice 在她的 PC 上有足够的空间来存储提取的内容foo。是否有某种方式cat可以直接从 DVD 读取这些文件并暂停流以允许她插入下一张 DVD?类似pausecatvolumecat

答案1

我不知道有这种cat味道,但这里有一个解决方案几乎作品:

  1. 在一个终端运行mkfifo myfifo; tail -c +1 -f myfifo | tar xfJ -
  2. 将第一张 DVD 插入 DVD-ROM 驱动器(例如 dev/sr0)。
  3. 在第二个终端运行dd if=/dev/sr0 of=myfifo
  4. 完成后dd,取出 DVD。
  5. 如果您有另一张 DVD,请将其插入 DVD-ROM 驱动器并转至步骤 3,否则转至步骤 6。
  6. 在第一个终端中,按 CTRL-C 杀死tailtar.

怎么运行的

诀窍是使用tail从命名管道连续读取。然后,的输出tail将通过管道传输到您要运行的命令。最初管道未打开,因此什么也没有发生。但是,当您开始使用 将数据泵入管道时ddtail会将其拾取并将其转发给您的命令。

当流向管道的数据流停止时,奇迹就会发生:tail保持其标准输出文件描述符打开,这会导致命令暂停。同时,tail只需等待更多输入。

问题

我说它几乎可以工作的原因是因为似乎存在缓冲问题,导致tail无法写入输入其中的最后一位数据。我希望有人能够提供解决这个问题的见解。

答案2

您可以编写自己的catpause脚本:

#!/bin/bash
while read -p 'ready ? ' >&2
do if [ y = "$REPLY" ]
   then cat /dev/dvd 
   fi
done |
tar xJf -

它会提示您stderr进行回复,如果是,y则将 DVD 复制到命令读取的管道中tar。完成后输入 control-D 表示文件结束。

相关内容