여러 GZip 파일의 빠른 연결


93

gzip 파일 목록이 있습니다.

file1.gz
file2.gz
file3.gz

압축을 풀지 않고 이러한 파일을 하나의 gzip 파일로 연결하거나 gzip하는 방법이 있습니까?

실제로 우리는 이것을 웹 데이터베이스 (CGI)에서 사용할 것입니다. 웹이 사용자로부터 쿼리를 수신하고 쿼리를 기반으로 모든 파일을 나열하고 사용자에게 다시 배치 파일로 제공합니다.

답변:


107

gzip 파일을 사용하면 다음과 같이 파일을 간단히 연결할 수 있습니다.

cat file1.gz file2.gz file3.gz > allfiles.gz

은 gzip RFC ,

gzip 파일은 일련의 "멤버"(압축 된 데이터 세트)로 구성됩니다. [...] 구성원은 이전, 사이 또는 이후에 추가 정보없이 단순히 파일에 차례로 나타납니다.

이것은 연결된 데이터의 단일 gzip 파일을 빌드하는 것과 정확히 동일하지 않습니다. 무엇보다도 모든 원본 파일 이름이 유지됩니다. 그러나 gunzip은 연결과 동일하게 처리하는 것 같습니다.

기존 도구는 일반적으로 추가 멤버의 파일 이름 헤더를 무시하기 때문에 결과에서 개별 파일을 추출하기가 쉽지 않습니다. 이를 가능하게하려면 대신 ZIP 파일을 빌드하십시오. ZIP과 GZIP은 모두 실제 압축에 DEFLATE 알고리즘을 사용합니다 (ZIP은 다른 압축 알고리즘과 옵션을 지원합니다. 방법 8은 GZIP의 압축에 해당하는 것입니다). 차이점은 메타 데이터 형식에 있습니다. 메타 데이터가 압축되지 않았기 때문에 gzip 헤더를 제거하고 대신 ZIP 파일 헤더와 중앙 디렉토리 레코드를 추가하는 것이 간단합니다. gzip 형식 사양ZIP 형식 사양을 참조하십시오 .


41
아니. 그냥 cat file1.gz file2.gz file3.gz > allfiles.gz. 정말 간단합니다 :)
bdonlan

1
기술적으로 말해서 그들은 보존됩니다. 기존 도구에는 일반적으로 별도로 추출 할 수있는 기능이 없기 때문입니다. ZIP 헤더와 디렉토리를 만드는 방법을 살펴보고 싶을 수 있습니다. ZIP 형식은 동일한 기본 압축 알고리즘을 사용하므로 압축되지 않은 메타 데이터를 변경하면됩니다. 한 번 봐 가지고 gzip.org/zlib/rfc-gzip.html (소스 형식) 및 pkware.com/documents/casestudies/APPNOTE.TXT을 .
bdonlan 2011

20
gz 파일의 zip을 빌드하는 것보다 낫습니다. cat답변 과 동일 하지만 추가 메타 데이터가 있습니다. 나중에 압축을 풀어 원래 파일 이름을 얻은 다음 필요에 따라 전체 또는 일부 압축을 풀 수 있습니다.
sorpigal 2011

2
@alvas zcat는 입력을 압축 해제하여 .gz확장자가 있는 압축 해제 된 출력을 제공합니다 .
bdonlan

2
분명히 첫 번째 gzip 회원의 끝에 도달하면 실수로 중지되는 도구가 있습니다. github.com/pysam-developers/pysam/issues/…
Jeremy Leipzig

51

man 1 gzip귀하의 요구 사항에 대한 내용 은 다음과 같습니다 .

여러 압축 파일을 연결할 수 있습니다. 이 경우 gunzip은 모든 구성원을 한 번에 추출합니다. 예를 들면 :

gzip -c file1  > foo.gz
gzip -c file2 >> foo.gz

그때

gunzip -c foo

다음과 같다

cat file1 file2

말할 필요도없이, file1로 대체 될 수있다 file1.gz.

다음 사항에 유의해야합니다.

gunzip은 모든 구성원을 한 번에 추출합니다.

따라서 모든 구성원을 개별적으로 얻으려면 원하는 경우 추가로 사용하거나 작성해야합니다.

그러나 이것은 man 페이지에서도 다룹니다.

나중에 구성원을 독립적으로 추출 할 수 있도록 여러 구성원이있는 단일 아카이브 파일을 만들려면 tar 또는 zip과 같은 아카이버를 사용하십시오. GNU tar는 -zgzip을 투명하게 호출 하는 옵션을 지원합니다 . gzip은 tar를 대체하는 것이 아니라 보완 용으로 설계되었습니다.


13

그냥 고양이를 사용하십시오. 매우 빠릅니다 (500MB의 경우 0.2 초)

cat *gz > final
mv final final.gz

그런 다음 zcat으로 출력을 읽어서 예쁜지 확인할 수 있습니다.

zcat final.gz

나는 'gz -c'의 다른 대답을 시도했지만 이미 gzip 파일을 입력으로 사용할 때 쓰레기로 끝났습니다 (두 번 압축 한 것 같습니다).

PV :

더 좋은 방법은 고양이 대신 'pv'입니다.

pv *gz > final
mv final final.gz

이것은 작동하는대로 진행률 표시 줄을 제공하지만 고양이와 동일한 작업을 수행합니다.


11

이러한 파일의 tar 파일을 만든 다음 tar 파일을 gzip하여 새 gzip 파일을 만들 수 있습니다.

tar -cvf newcombined.tar file1.gz file2.gz file3.gz
gzip newcombined.tar

8
새 tar 파일을 정확히 gzip해야하는 이유는 무엇입니까? 이미 압축되어 있습니다 (작은 tar의 메타 데이터는 제외).
thiton 2011

2
당신이 옳습니다. 개별 파일이 이미 gzip으로 압축 되었기 때문에 gzip을 사용하든 그렇지 않든 파일 크기에는 큰 차이가 없습니다. 세 개의 개별 파일 중 gzip 파일을 원했기 때문입니다.
Drona

1
추가 gzip은 아무런 이득없이 콘텐츠에 대한 액세스 속도를 저하시킵니다. OPs 요구 사항은 실제로 결과 아카이브가 단일 파일이어야하며 결과 파일이 gzip 파일이어야한다고 가정 할 이유가없는 것 같습니다.
mc0e 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.