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
그럴 필요가 없습니다. 종료 상태를 반환할 수 있는지 여부입니다.wait
wait "$!"
unzip