名前の大きいファイルがあるとしましょうfoo.tar.xz
。私はファイルを4.7 GB未満のサイズに分割し、名前などのsplit -b 4689887232 foo.tar.xz foo.tar.xz.
ファイルを提供しました。その後、各ファイルを別のDVDに記録し、かなり大きなDVDを使用してAliceに送信しました。foo.tar.xz.aa
foo.tar.xz.ab
帰還鳩。
アリスは各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など)に挿入します。
- 2番目の端末の実行
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 と入力してファイルの終わりを示します。