UNIX에서 zlib 데이터를 압축 해제하는 방법은 무엇입니까?


106

파이썬에서 zlib 압축 데이터를 다음과 같이 만들었습니다.

import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
    f.write(z)

(혹은 셸 한 라이너 echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data)

이제 셸에서 데이터를 압축 해제하고 싶습니다. 어느 쪽도하지 zcat않고 uncompress일 :

$ cat /tmp/data | gzip -d -
gzip: stdin: not in gzip format

$ zcat /tmp/data 
gzip: /tmp/data.gz: not in gzip format

$ cat /tmp/data | uncompress -
gzip: stdin: not in gzip format

gzip과 같은 파일을 만들었지 만 헤더가없는 것 같습니다. 불행히도 gzip 매뉴얼 페이지에서 이러한 원시 데이터를 압축 해제하는 옵션이 없으며 zlib 패키지에는 실행 가능한 유틸리티가 없습니다.

원시 zlib 데이터를 압축 해제하는 유틸리티가 있습니까?


여기에 추가 답변이 많이 있습니다 : stackoverflow.com/questions/3178566/deflate-command-line-tool
Jack O'Connor

답변:


140

표준 사용하여 압축을 해제 할 수도 있습니다 + 당신이없는 경우, 또는 사용할 또는 다른 도구를.
트릭은 gzip 매직 번호와 압축 방법 을 다음의 실제 데이터 앞에 추가하는 것 입니다 zlib.compress.

printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - /tmp/data |gzip -dc >/tmp/out

편집 :
@ d0sboots 코멘트 : RAW Deflate 데이터의 경우 2 바이트를 더 추가해야합니다.
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"

이 Q on SO 는이 접근법에 대한 자세한 정보를 제공합니다. 거기에 대한 대답은 8 바이트 바닥 글도 있음을 나타냅니다.

@ Vitali-Kushner 및 @ mark-bessey 사용자는 잘린 파일로도 성공했다고보고 했으므로 gzip 바닥 글이 반드시 필요한 것은 아닙니다.

@ tobias-kienzler는 대해이 기능을 제안했습니다 .
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)


gzip은 작동하지 않지만 zlib-flate는 작동합니다 (pdf 페이지 컨텐츠 스트림).
Daneel S. Yaitskov

69

@tino 사용자는 OpenSSL 답변 아래에 댓글을 달았지만 별도로해야한다고 생각합니다.

zlib-flate -uncompress < FILE

나는 이것을 시도했고 그것은 나를 위해 일했다.

zlib-flate패키지에서 찾을 수 있습니다 qpdf(다른 답변의 의견에 따라 Debian Squeeze 및 Fedora 23에서)


3
다른 답변과
달리이

2
@ polym, 어떻게 macOS에 zlib-flate 설치 되었습니까? 나는 어디에도 보이지 않습니다.
와일드 카드

4
@Wildcard 늦게 응답해서 죄송합니다. 주석 에서 언급 한대로 qpdf설치 한 패키지 와 함께 제공 된 것으로 생각합니다 -또는이 답변의 마지막 문장을보십시오 :). 또한 정말 멋지므로 시간이 있으면 그것을보십시오! brewqpdf
polym

brew install qpdf, 위에 나열된 명령 :-) 감사합니다!
페르난도 가브리엘

60

해결책 (가능한 것 중 하나)을 찾았습니다 .openssl을 사용하고 있습니다 .

$ openssl zlib -d < /tmp/data

또는

$ openssl zlib -d -in /tmp/data

* 참고 : zlib 기능은 최근 openssl 버전> = 1.0.0에서 사용 가능합니다 (OpenSSL은 zlib 또는 zlib-dynamic 옵션으로 구성 / 빌드해야하며 후자는 기본값 임)


25
(OpenSSL을 0.9.8을 가지고) 데비안 짜기에있다 zlib-flateqpdf패키지로 제공된다. 처럼 사용할 수 있습니다 zlib-flate -uncompress < FILE.
티노

7
zlib는 최신 버전의 OpenSSL에서 제거되었으므로이 팁은 매우 유용합니다. @Tino
Alexandr Kurilin

1
감사. 이 솔루션은 "gzip"( "gzip"이 "예기치 않은 파일 끝"인쇄를 중단하는 동안 "openssl"이 압축 해제 된 것)을 사용하는 것보다 짧은 입력 파일의 압축을 풀 때 더 나은 환경을 제공합니다.
Daniel K.

2
@Tino 이것은 별도의 답변이어야합니다
Catskul

1
@Tino, Fedora 23의 패키지 qpdf를 통해서도 이용할 수 있습니다. Alexandr Kurilin, zlib은 1.0.2d-fips로도 제공됩니다.
maxschlepzig

28

zlib 압축 라이브러리의 공동 저자 인 Mark Adler의 pigz 를 추천 합니다. 사용 가능한 플래그를 보려면 실행 하십시오.pigz

당신은 알 것이다 :

-z --zlib Compress to zlib (.zz) instead of gzip format.

-d플래그를 사용하여 압축을 풀 수 있습니다 .

-d --decompress --uncompress Decompress the compressed input.

'test'라는 파일을 가정하면 :

  • pigz -z test -test.zz라는 zlib 압축 파일을 만듭니다.
  • pigz -d -z test.zz -test.zz를 압축 해제 된 테스트 파일로 변환

OSX에서 실행할 수 있습니다 brew install pigz


7
잘 찾아라! zlib 파일 자체를 감지 할 수있는 것처럼 보이므로 unpigz test.zz잘 작동합니다.
Stéphane Chazelas

내 데이터를 압축 해제하지 않았습니다.
버나드

1
@cybernard 아마도 zlib 파일이 없을 것입니다. $>file hello.txt.zz hello.txt.zz: zlib compressed data
snodnipper

11

zlib파일 형식이 아닌 gzip에서 사용하는 압축을 구현합니다. 대신, 자체를 사용하는 gzip모듈 을 사용해야 합니다 zlib.

import gzip
s = '...'
with gzip.open('/tmp/data', 'w') as f:
    f.write(s)

좋아, 그러나 내 상황은 내가 수십 / 수십만 개의 파일을 만든 것이므로 .. :)

1
파일이 불완전합니다. 원본 데이터가 아직없는 경우 zlib압축 을 풀고 다시 압축해야 gzip할 수도 있습니다.
Greg Hewgill

6
@mykhal, 실제로 압축을 풀 수 있는지 확인하기 전에 왜 수십만 개의 파일을 만들었습니까?

3
하 피온, 나는 그들을 압축 해제 할 수 있습니다, 나는 파이썬에서 다시하고 싶지 않다면 어떤 덜 일반적인 또는 더 많은 urile 또는 zgip 설정을 사용할 수 있는지 궁금합니다.

3

이것은 할 수 있습니다 :

import glob
import zlib
import sys

for filename in sys.argv:
    with open(filename, 'rb') as compressed:
        with open(filename + '-decompressed', 'wb') as expanded:
            data = zlib.decompress(compressed.read())
            expanded.write(data)

그런 다음 다음과 같이 실행하십시오.

$ python expander.py data/*

고마워요 zlib.decompress. 아마 나는 도보 기능을 사용할 것입니다. 난 쉘 : 글로브 와일드 카드와 파일의 내 많은 양의 처리 할 것인지 확실하지 않다

확장으로 작성된 파일은 쉘 file명령을 사용하여 여전히 "zlib 압축 데이터"로 체크 아웃 됩니까? 방법 것입니다?
K.-Michael Aye

가짜 헤더로도 nope가 작동하지 않습니다.
버나드

3

Mark Adler가 직접 zpipe.c 찾은 예제 프로그램 (zlib 라이브러리의 소스 배포와 함께 제공됨)은 원시 zlib 데이터가있는 이러한 시나리오에 매우 유용합니다. 다음과 같이 컴파일 cc -o zpipe zpipe.c -lz하고 압축을 해제하십시오 zpipe -d < raw.zlib > decompressed. -d플래그 없이 압축을 수행 할 수도 있습니다 .


2

전체 POSIX 호환 UNIX (공식적으로 인증!) 인 맥 OS,에, OpenSSL더있다 zlib, 어떤 지원이없는 zlib-flate중 첫 번째 솔루션뿐만 아니라 모든 파이썬 솔루션으로 작동하는 동안, 첫 번째 솔루션은 파일에있을 우편 데이터를 필요로 다른 모든 솔루션을 사용하면 Python 스크립트를 작성해야합니다.

다음은 명령 줄 원 라이너로 사용할 수 있고 STDIN 파이프를 통해 입력을 받고 새로 설치된 macOS를 통해 즉시 사용할 수있는 Perl 기반 솔루션입니다.

cat file.compressed | perl -e 'use Compress::Raw::Zlib;my $d=new Compress::Raw::Zlib::Inflate();my $o;undef $/;$d->inflate(<>,$o);print $o;'

더 좋은 형식의 Perl 스크립트는 다음과 같습니다.

use Compress::Raw::Zlib;
my $decompressor = new Compress::Raw::Zlib::Inflate();
my $output;
undef $/;
$decompressor->inflate(<>, $output);
print $output;

1

이것을 사용하여 zlib로 압축 할 수 있습니다.

openssl enc -z -none -e < /file/to/deflate

그리고 이것은 수축합니다.

openssl enc -z -none -d < /file/to/deflate

4
부여 unknown option '-z'우분투 16.04 및에OpenSSL 1.0.2g 1 Mar 2016
티노

2
맥에서 같은 오류
K.-Michael Aye

-3
zcat -f infile > outfile 

fedora25에서 나를 위해 일합니다.


1
zcatgzip 형식의 파일에서만 작동합니다.
Anthony Geoghegan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.