핵심 요약
- 여러 .tar.gz 파일을 합치려고 단순 `cat` 명령어로 바이트를 이어 붙였으나 정상 작동하지 않았습니다.
- `tar`는 테이프 매체 시절 설계된 EOF 마커 때문에 첫 번째 파일 이후가 무시되는 반면, `gzip`은 EOF 마커가 없어 단순 결합이 가능한 구조적 차이가 있습니다.
- 결국 .tar.gz를 올바르게 결합하려면 내부 아카이브 멤버들을 추출해 단일 EOF 마커를 가진 새 아카이브로 재구성해야 합니다.
요약 여러 개의 .tar.gz 압축 파일을 하나로 합치려 할 때 단순히 `cat` 명령어로 바이트를 이어 붙이면 왜 정상적으로 작동하지 않는지에 대해 다룬 개발 기술 분석 글입니다.
`tar`는 본래 자기 테이프(magnetic tape) 저장을 위해 고안된 아카이버로, 여러 파일과 메타데이터를 하나의 연속된 스트림으로 묶습니다. 테이프 매체의 특성상 순차 읽기와 추가 쓰기(append-only) 방식으로 동작하며, 파일 데이터 끝에는 아카이브의 종료를 알리는 0으로 채워진 블록(EOF 마커)이 최소 2개 이상 들어갑니다. 일반적인 tar 리더는 이 EOF 마커를 만나면 뒤에 어떤 데이터가 있든 읽기를 멈추기 때문에, 단순 `cat`으로 여러 tar 파일을 이어 붙이면 첫 번째 아카이브의 EOF 마커 이후 내용은 전부 무시됩니다. 이를 해결하려면 각 아카이브의 내용을 풀어내 하나의 온전한 아카이브로 재작성해야 합니다.
반면 `gzip`은 하드웨어가 아닌 특허 문제(당시 compress의 LZW 알고리즘 특허 회피)와 스트리밍 편의성을 위해 설계된 압축 포맷입니다. gzip은 여러 멤버(member)가 연속으로 이어질 수 있으며 별도의 EOF 마커 없이 최종 트레일러로 끝나기 때문에, 순수 gzip 파일끼리는 `cat`으로 이어 붙여도 `gunzip`을 통해 단일 스트림으로 온전히 압축 해제할 수 있습니다.
결국 `.tar.gz`는 tar 아카이브를 gzip으로 감싼 구조이므로, 단순히 파일 레벨에서 `cat`을 실행하면 gzip 단계를 풀었을 때 내부 tar 스트림에 여전히 중간 EOF 마커가 남아 있어 정상 결합이 불가능합니다. 저자는 이를 계기로 과거 물리 매체 제약과 특허 역사가 오늘날 파일 포맷 구조에 어떻게 남아있는지 설명합니다.
Sponsored · 광고