zip 파일의 내용 일부를 다운로드하는 방법이 있습니까?


1

서버에 업로드 된 큰 zip 파일이 있고 필요한 것이 있다면 그 중 일부는 내용이고, 여는 방법이 있습니까? 다운로드 할 파일을 선택하십시오.


그래서 질문은 정말로 일반적이지만 보통 그렇지 않습니다. 일부 압축 형식을 사용하면 불완전한 파일에서 일부 내용을 추출 할 수 있습니다 rar x --kb myincompletefile.rar. 에 대한 7zip 이 대답조차 보아라. . 어떤 종류의 서버입니까? 당신이 사용하고 있습니까? zip 그냥 압축을하거나 엄격히 말하면됩니다. zip 파일?
Hastur

나는 http 또는 ftp 프로토콜 또는 급류를 통해 다운로드를 위해 온라인으로 뿌리 박힌 파일에 대해서 이야기하고 있으며, 나는 엄격하게 .zip 파일을 참조한다.
habibhassani

그럼 네가 대답 할까봐 걱정된다. 아니 . :-( 그러나 당신은 항상 다운로드를 시작할 수 있고, 부분적인 부분을 수정 / 추출하려고하고, 당신이 필요로하는 것이 있는지 볼 수 있습니다 ... ftp 하에서 고유 한 zip 파일을 가진 소프트웨어의 배포판을 언급한다면, 그들은 때때로 "열다" 버전도 정상적인 경로로 탐색 할 수 있습니다 ... 나는 뭔가처럼 생각합니다. CTAN 거울 ...
Hastur

infos에 대해 대단히 감사합니다. 유용한 정보로 의견을 쓸 수 있으면 좋겠지 만 1 단계입니다.
habibhassani

헤더를 다운로드 한 다음 부분 다운로드를 다시 시작하는 것과 관련된 HTTP 옵션을 사용하면 이러한 일이 가능할 것으로 판단됩니다. 프로그래머라면 제대로 작동 할 수 있습니다. 그러나, 나는 실제로이 일을 듣지 못했다. 파일의 일부만 얻는 것은 일반적으로 미디어 (오디오 / 비디오)로 수행되는 것이며, "스트리밍"기술을 사용할 수도 있습니다 (예전에는 다른 프로토콜이나 플래시와 같은 웹 브라우저 애드온을 사용할 수 있습니다. HTML5도 이와 유사 함). 실제 연습에서 실제로이 사실을 듣지 못했기 때문에 나는 "아니오"라는 대답에 동의합니다.
TOOGAM

답변:


1

나는 파이썬 스크립트를 썼다. list_remote_zip.py HTTP를 통해 액세스 할 수있는 zip 파일의 파일을 나열 할 수 있습니다.

import urllib2, struct, sys

def open_remote_zip(url, offset=0):
 return urllib2.urlopen(urllib2.Request(url, headers={'Range': 'bytes={}-'.format(offset)}))

offset = 0
zipfile = open_remote_zip(sys.argv[1])
header = zipfile.read(30)

while header[:4] == 'PK\x03\x04':
 compressed_len, uncompressed_len = struct.unpack('<II', header[18:26])
 filename_len, extra_len = struct.unpack('<HH', header[26:30])
 header_len = 30 + filename_len + extra_len
 total_len = header_len + compressed_len

 print('{}\n offset: {}\n length: {}\n  header: {}\n  payload: {}\n uncompressed length: {}'.format(zipfile.read(filename_len), offset, total_len, header_len, compressed_len, uncompressed_len))
 zipfile.close()

 offset += total_len
 zipfile = open_remote_zip(sys.argv[1], offset)
 header = zipfile.read(30)

zipfile.close()

파일의 끝 부분에있는 zip 파일의 중앙 디렉토리를 사용하지 않습니다. 대신, 처음부터 시작하여 개별 로컬 헤더를 구문 분석하고 페이로드를 건너 뛰고 다른 헤더에 착륙하기를 원합니다. 오프셋으로 건너 뛸 때마다 새로운 요청을 보냅니다. 물론 이것은 서버를 지원하는 서버에서만 작동합니다. Range HTTP 헤더.

명령 줄 인수로 URL을 zip 파일로 전달하면됩니다. 사용 예제와 출력은 다음과 같이 보일 것입니다 :

$ python list_remote_zip.py http://dl.xonotic.org/xonotic-0.8.1.zip
Xonotic/Makefile
 offset: 0
 length: 1074
  header: 46
  payload: 1028
 uncompressed length: 5019
Xonotic/source/darkplaces/
 offset: 1074
 length: 56
  header: 56
  payload: 0
 uncompressed length: 0
Xonotic/source/darkplaces/bih.h
 offset: 1130
 length: 1166
  header: 61
  payload: 1105
 uncompressed length: 2508
Xonotic/source/darkplaces/portals.h
 offset: 2296
 length: 334
  header: 65
  payload: 269
 uncompressed length: 648
...

파일 중 하나를 다운로드하려면, 나는 더 끔찍한 글을 썼다. get_file_from_remote_zip.sh 주위에 그것을 사용하는 bash 스크립트 wget:

info=$(python list_remote_zip.py "$1" | grep -m 1 -A 5 "^$2\$" | tail -n +2)
tmpfile=$(mktemp)

wget --start-pos $(echo "$info" | grep offset | grep -o '[[:digit:]]*') -O - "$1" | head -c $(echo "$info" | grep -m 1 length | grep -o '[[:digit:]]*') >"$tmpfile"

printf '\x1f\x8b' # gzip magic
tail -c +9 <"$tmpfile" | head -c 1 # copy compression method
printf '\0\0\0\0\0\0\x03' # some flags and mtime
tail -c "+$(expr 1 + $(echo "$info" | grep header | grep -o '[[:digit:]]*'))" <"$tmpfile"
tail -c +15 <"$tmpfile" | head -c 4 # The CRCs seem to be compatible.
tail -c +23 <"$tmpfile" | head -c 4

rm "$tmpfile"

2 개의 인수가 필요합니다. 첫 번째 파일은 압축 파일의 URL이고 두 번째 파일은 추출 할 파일입니다. 추출 할 파일의 이름은 이전의 파일에 표시된대로 완전해야하며 정확하게 입력해야합니다. list_remote_zip.py Python 스크립트는 파일에 대한 정보를 얻기 위해 사용합니다. 그런 다음 wget 적절한 길이로 오른쪽 오프셋에서 다운로드하십시오. 이 zip "슬라이스"를 임시 파일에 저장 한 다음 임시 파일에 gzip -formatted 파일은 다음에 파이프되어 압축 해제 될 수 있습니다. gzip. "슬라이스"자체는 끝에 중앙 디렉토리가 없기 때문에 유효한 zip 파일이 아닙니다. 수정 가능 zip '에스 -FF 옵션을 사용했지만 헤더를 조금 변경하고 gzip 파일로 변환하기로 결정했습니다. 모두 (PK) zip과 gzip은 같은 것을 사용합니다. 꺾다 압축 알고리즘 및 CRC-32 체크섬조차도 호환되는 것처럼 보입니다.

다음은 Xonotic의 아카이브에서 무작위 파일을 다운로드하는 방법의 예입니다. http://dl.xonotic.org/xonotic-0.8.1.zip 압축을 풀고 로컬 파일에 저장합니다.

bash get_file_from_remote_zip.sh http://dl.xonotic.org/xonotic-0.8.1.zip Xonotic/source/darkplaces/mprogdefs.h | gzip -d >mprogdefs.h

그건 그렇고, 도와 줬어.
Karel Vlk

나는 그것을 사용하는 방법을 모르지만 어쨌든 고마워.
habibhassani

첫 번째 코드 블록은 내가 호출 한 Python (2) 스크립트입니다. list_remote_zip.py. 그래서 파이썬을 설치했다면 그것을 실행할 수 있고 URL을 zip 파일에 다음과 같이 커맨드 라인 인자로 넘겨 줄 수 있습니다 : python list_remote_zip.py http://dl.xonotic.org/xonotic-0.8.1.zip
Karel Vlk

두 번째 스크립트는 유닉스 셸 스크립트이며, bash와 유사한 것으로 실행 가능해야한다. 나는 조금 더 명확하게하기 위해 조금 더 대답을 확장했다.
Karel Vlk

0

파일 서버에 액세스하고 winrar (및 다른 유사한 응용 프로그램)를 설치 한 경우 .zip을 열고 원하는 파일을 드래그 할 수 있습니다.

웹 서버에 관해 이야기하고 있다면, 나는 할 수 있다고 생각하지 않는다.


0

서버가 다시 시작된 다운로드를 지원한다고 가정하면 이론적으로이 작업을 수행하는 클라이언트를 작성할 수 있습니다. 디렉토리를 확보하기 위해 충분히 큰 블록을 잡고 그 정보를 사용하여 실제로 데이터를 가져 오기 위해 필요한 것을 파악합니다 - 데이터가 충분할 때만 해당 위치에서 다운로드를 시작하고 중지하십시오. 내가 주변을 샅샅이 뒤 졌을 때부터 너무 오랜 세월이 지났습니다. 무차별 공격이 아닌 디렉토리의 시작을 찾는 방법이 있다는 것을 상기하지 않습니다.

나는 그런 클라이언트의 결코 전해 듣지 않으며 왜 사람이 개발 될지 상상할 수 없다 - 합리적으로 조각에서 다운로드되고 그 후에 웹 마스터가 1 개의 큰 zip 파일로 그것을 저장하는 왜 인 경우에 ???


큰 zip 파일을 다운로드 할 때 파일이 손상되어 일부 파일이 손상되는 경우가 있으므로이 솔루션이 있으면 손상된 파일 만 다운로드하는 것이 내 삶을 편하게 만듭니다.
habibhassani

@habibhassani 즉, zip 파일이라는 사실은별로 관련이 없으므로 파일의 손상된 부분 만 복구하려고합니다.
Loren Pechtel

정확하게이 질문은 내 경험에 근거합니다.
habibhassani
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.