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.