假设我有一个名为 的大文件foo.tar.xz
。我使用 将该文件分成每个大小不到 4.7GB 的部分,split -b 4689887232 foo.tar.xz foo.tar.xz.
这给了我名为 、 等的文件foo.tar.xz.aa
。foo.tar.xz.ab
然后我将每个文件写入不同的 DVD 并使用相当大的 DVD 将其发送给 Alice信鸽。
现在 Alice 可以插入每张 DVD,将每个文件复制到她的 PC,然后使用cat
和xz
获取以下内容foo
:cat foo.tar.xz.* | tar xfJ -
现在假设 Alice 在她的 PC 上有足够的空间来存储提取的内容foo
。是否有某种方式cat
可以直接从 DVD 读取这些文件并暂停流以允许她插入下一张 DVD?类似pausecat
或volumecat
?
答案1
我不知道有这种cat
味道,但这里有一个解决方案几乎作品:
- 在一个终端运行
mkfifo myfifo; tail -c +1 -f myfifo | tar xfJ -
- 将第一张 DVD 插入 DVD-ROM 驱动器(例如 dev/sr0)。
- 在第二个终端运行
dd if=/dev/sr0 of=myfifo
- 完成后
dd
,取出 DVD。 - 如果您有另一张 DVD,请将其插入 DVD-ROM 驱动器并转至步骤 3,否则转至步骤 6。
- 在第一个终端中,按 CTRL-C 杀死
tail
并tar
.
怎么运行的
诀窍是使用tail
从命名管道连续读取。然后,的输出tail
将通过管道传输到您要运行的命令。最初管道未打开,因此什么也没有发生。但是,当您开始使用 将数据泵入管道时dd
,tail
会将其拾取并将其转发给您的命令。
当流向管道的数据流停止时,奇迹就会发生: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 表示文件结束。