이름이 큰 파일이 있다고 가정해 보겠습니다 foo.tar.xz
. 나는 파일을 크기가 4.7GB 미만인 부분으로 분할하여 이름 등 split -b 4689887232 foo.tar.xz foo.tar.xz.
의 파일을 제공했습니다 . 그런 다음 각 파일을 다른 DVD에 기록하고 상당히 큰 DVD를 사용하여 Alice에게 보냈습니다.foo.tar.xz.aa
foo.tar.xz.ab
귀환 비둘기.
이제 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를 입력하여 파일의 끝을 나타냅니다.