쉘의 원격 호스트에서 대용량 파일을 추출할 때 모래시계/진행 상황

쉘의 원격 호스트에서 대용량 파일을 추출할 때 모래시계/진행 상황

unzip원격 디렉터리에서 셸 내의 로컬 디렉터리로 매우 큰 파일을 가져오는 셸 스크립트가 있습니다 . 이 작업은 약 20~30분 정도 꽤 오랜 시간이 걸립니다.

#!/bin/sh


unzip RemoteHostNFSDirectory -d LocalHostDirectory > output.log

(6.2GB 파일입니다.)

위 명령을 진행률 또는 모래시계 표시줄에 삽입하여 로컬 디렉터리에 대한 추출이 완료되면 사용자가 중단되고 성공적으로 완료된다고 생각하지 않도록 하려면 어떻게 해야 합니까? 성공 또는 실패 오류를 인쇄할 수 있습니다.

(저는 쉘을 처음 사용하는데 불편을 끼쳐드려 죄송합니다.)

답변1

예비 설명

걸려 있지 않은지 여부에 관계없이 "진행률 표시줄이나 모래시계 막대를 표시하여 사용자가 그냥 걸려 있다고 생각하지 않도록"하는 unzip것은 정말 쉬울 것입니다 . 이 답변에서는 사용자를 오도하고 싶지 않다고 가정합니다. 대답은 unzip단지 허위 지표가 아닌 진행 상황을 보여 주려고 합니다.


가장 직접적인 방법

만약 당신의unzip 표준 입력에서 읽을 수 있음그리고 전체 아카이브를 추출한 다음 아카이브를 읽는 동안 진행 상황을 측정하려고 합니다.

< /path/to/archive.zip pv | unzip -

pv진행 정보를 표시하고 데이터를 전달하는 모든 도구로 대체될 수 있습니다.


기타 일반적인 방법

표준 입력에서 데이터를 읽을 수 없지만 unzip아카이브에 파일이 하나만 있고 추출에 사용하려는 파일 이름을 알고 있는 경우 표준 출력으로 추출하고 전달하여 pv진행률 표시기를 얻습니다.

unzip -p /path/to/archive.zip | pv > /extracted/name

아카이브에 더 많은 파일이 있을 수 있는 경우 추출할 개별 파일을 지정해야 합니다.

unzip -p /path/to/archive.zip internal/path/to/compressed/file | pv > /extracted/name

단일 파일을 사용하여 여러 파일을 추출 unzip -p하면 해당 파일 이 /extracted/name.unzip

내부 이름을 모르는 경우 unzip -l또는 구문 분석이 필요합니다 unzip -v. 이런 식으로 pv -s.

이렇게 하면 unzip -p로그를 얻을 수 없습니다 unzip. 종료 상태에 따라 다릅니다. 어떤 종류의 로그가 필요하면 쉘 스크립트 자체가 로그에 기록해야 합니다. 스크립트는 적어도 /extracted/name이를 기록할 수 있도록 알아야 합니다.


퓨즈?

나는 무엇이든 기대한다FUSE 기반 솔루션일반 파일을 복사할 수 있는 모든 도구를 사용할 수 있습니다. 진행률 표시줄은 도구에 따라 달라질 수 있습니다. 명령은 다음과 같이 간단할 수 있습니다.

pv /mountpoint/internal/path/to/compressed/file > /extracted/name

이것이 반드시 도움이 되는 것은 아닙니다. 나는 그것을 테스트했습니다 fuse-zip. 실제 복사 도구가 작동하기 전에 추출(임시 파일이나 메모리 등으로)하는 것처럼 보입니다. 따라서 실제 추출에는 여전히 진행률 표시가 없습니다. 선택한 도구는 나중에 추출된 파일을 복사하도록 지시할 수 있습니다. "매우 큰 파일"을 캐싱하는 데에는 고유한 문제가 있으며 도구가 문제를 해결하려고 시도하는지 여부와 방법이 확실하지 않습니다. fuse-zip어쨌든 원래 문제를 해결하지 못하기 때문에 중요하지 않습니다 .

나도 그것을 테스트했습니다 archivemount. 진행률 표시줄은 pv즉시 시작되지만 전체 설정이 너무 느립니다. archivemount읽기 과정이 순차적으로 읽혀지더라도 아카이브 내에서 앞뒤로 점프(탐색)하는 현상이 있음 을 발견했습니다 . 이는 "매우 큰 파일"에는 실용적이지 않을 수 있습니다.아마도일부 조정이 가능합니다. 제가 놓쳤을 수도 있습니다.


속이다pv

영리하지만 다소 번거로운 접근 방식은 다음과 같습니다 pv -d.

unzip /path/to/archive.zip > output.log &
pv -d "$!"
wait "$!"

이 접근 방식은 기본 형식에서는 사용자에게 원하는 것보다 더 많은 것을 표시하지만 "사용자가 단지 정지라고 생각하지 않도록" 해야 합니다. 일부 옵션 pv이나 "수동" 구문 분석 /proc/$!/fd/proc/$!/fdinfo구문 분석 안함 도 pv도움이 될 수 있습니다.

unzip백그라운드에서 작업하면 사용자로부터 쉽게 응답을 받을 수 없으므로 이 점을 unzip -o주의해서 고려하세요.

pv종료 후 종료되므로 엄격하게 기다리려는 경우에는 unzip그럴 필요가 없습니다. 종료 상태를 반환할 수 있는지 여부입니다.waitwait "$!"unzip

관련 정보