gzip 파일 목록이 있습니다.
file1.gz
file2.gz
file3.gz
압축을 풀지 않고 이러한 파일을 하나의 gzip 파일로 연결하거나 gzip하는 방법이 있습니까?
실제로 우리는 이것을 웹 데이터베이스 (CGI)에서 사용할 것입니다. 웹이 사용자로부터 쿼리를 수신하고 쿼리를 기반으로 모든 파일을 나열하고 사용자에게 다시 배치 파일로 제공합니다.
답변:
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 형식 사양을 참조하십시오 .
cat
답변 과 동일 하지만 추가 메타 데이터가 있습니다. 나중에 압축을 풀어 원래 파일 이름을 얻은 다음 필요에 따라 전체 또는 일부 압축을 풀 수 있습니다.
zcat
는 입력을 압축 해제하여 .gz
확장자가 있는 압축 해제 된 출력을 제공합니다 .
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는
-z
gzip을 투명하게 호출 하는 옵션을 지원합니다 . gzip은 tar를 대체하는 것이 아니라 보완 용으로 설계되었습니다.
그냥 고양이를 사용하십시오. 매우 빠릅니다 (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
이것은 작동하는대로 진행률 표시 줄을 제공하지만 고양이와 동일한 작업을 수행합니다.
이러한 파일의 tar 파일을 만든 다음 tar 파일을 gzip하여 새 gzip 파일을 만들 수 있습니다.
tar -cvf newcombined.tar file1.gz file2.gz file3.gz
gzip newcombined.tar
cat file1.gz file2.gz file3.gz > allfiles.gz
. 정말 간단합니다 :)