gzip: 리눅스 파일 압축과 gzip 압축 풀기, gunzip, zcat 사용법

gzip은 리눅스에서 파일 하나를 .gz 파일로 압축하는 명령어이고, 압축을 풀 때는 같은 명령에 -d를 붙이거나 gunzip을 사용합니다. AlmaLinux 9 서버에서 31,878바이트 접속 로그를 압축한 결과 4,424바이트로 줄었고, 압축을 풀자 원래 크기와 수정 시각이 그대로 돌아왔습니다.
아래 출력은 AlmaLinux 9.8 서버의 root 계정으로 시험용 폴더에서 실행한 결과이고, 시각은 UTC 기준입니다. 접속 로그와 메모, 설정 파일은 시험용으로 만든 예시 파일입니다. 로그에 나오는 IP 주소도 문서용 예시 값입니다.
1️⃣ gzip 명령어 사용법
시험용 폴더에는 접속 로그 둘과 메모 파일 둘, 설정 파일이 든 config 폴더와 빈 restore 폴더가 있습니다.
ls -ltotal 88
-rw-r--r-- 1 root root 31878 Oct 28 23:50 access.log
-rw-r--r-- 1 root root 47748 Oct 27 23:59 access.log-20261027
drwxr-xr-x 2 root root 39 Oct 29 00:19 config
-rw-r--r-- 1 root root 45 Oct 28 14:30 memo.txt
-rw-r--r-- 1 root root 426 Oct 27 09:10 readme.txt
drwxr-xr-x 2 root root 6 Oct 29 00:19 restoregzip 뒤에 파일 이름을 적으면 그 파일이 이름 끝에 .gz를 붙인 압축 파일로 바뀝니다. access.log를 압축하는 아래 명령은 끝나도 따로 출력하는 내용이 없습니다.
gzip access.log압축한 뒤 ls -l로 보면 access.log는 없고 access.log.gz만 남아 있습니다. 31,878바이트였던 로그가 4,424바이트가 되었고, 수정 시각은 원래 파일의 시각 그대로입니다.
ls -l access.log access.log.gzls: cannot access 'access.log': No such file or directory
-rw-r--r-- 1 root root 4424 Oct 28 23:50 access.log.gz-v를 붙이면 파일마다 줄어든 비율과 새 파일 이름이 나옵니다. readme.txt 줄의 [81.5%]는 원래 크기에서 줄어든 비율이고, [replaced with]는 원래 파일을 .gz 파일로 바꿨다는 뜻입니다.
gzip -v readme.txtreadme.txt: 81.5% -- replaced with readme.txt.gz원래 파일을 남기려면 -k를 붙입니다. memo.txt를 -k로 압축하면 memo.txt와 memo.txt.gz가 나란히 남습니다.
gzip -k memo.txtls -l memo.txt memo.txt.gz-rw-r--r-- 1 root root 45 Oct 28 14:30 memo.txt
-rw-r--r-- 1 root root 71 Oct 28 14:30 memo.txt.gz45바이트인 memo.txt는 압축한 뒤 71바이트로 오히려 커졌습니다. 공식 매뉴얼 기준으로 gzip은 결과가 원래보다 커져도 압축을 진행하고, 압축 파일 안에 원래 파일 이름과 시각을 함께 저장합니다.
파일 여러 개를 한 번에 적으면 파일마다 .gz 파일이 따로 생깁니다. config 폴더의 설정 파일 둘을 압축하면 app.conf.gz와 site.conf.gz 두 파일이 됩니다.
gzip -v config/app.conf config/site.confconfig/app.conf: 78.7% -- replaced with config/app.conf.gz
config/site.conf: 87.7% -- replaced with config/site.conf.gzls -l config/total 8
-rw-r--r-- 1 root root 206 Oct 20 11:00 app.conf.gz
-rw-r--r-- 1 root root 93 Oct 20 11:05 site.conf.gz2️⃣ gzip 압축 풀기
압축한 access.log.gz를 -d로 풀면 출력 없이 access.log가 다시 생기고, access.log.gz는 남지 않습니다.
gzip -d access.log.gzls -l access.log access.log.gzls: cannot access 'access.log.gz': No such file or directory
-rw-r--r-- 1 root root 31878 Oct 28 23:50 access.log다시 생긴 access.log는 크기가 31,878바이트이고, 수정 시각도 압축하기 전과 같은 Oct 28 23:50입니다.
gunzip은 gzip -d와 같은 일을 하는 명령입니다. -k를 함께 붙이면 압축 파일을 남긴 채 풀고, -v 줄의 [created]는 .gz 파일을 지우지 않고 새 파일을 만들었다는 뜻입니다.
gunzip -kv readme.txt.gzreadme.txt.gz: 81.5% -- created readme.txtls -l readme.txt readme.txt.gz-rw-r--r-- 1 root root 426 Oct 27 09:10 readme.txt
-rw-r--r-- 1 root root 108 Oct 27 09:10 readme.txt.gzgzip에는 풀 폴더를 정하는 옵션이 없어, 다른 폴더에 풀 때는 -c로 풀린 내용을 표준 출력으로 보내고 [>] 뒤에 새 파일 경로를 적습니다. 아래는 memo.txt.gz를 restore 폴더의 memo.txt로 푸는 명령입니다.
gzip -dc memo.txt.gz > restore/memo.txtls -l restore/total 4
-rw-r--r-- 1 root root 45 Oct 29 00:19 memo.txt-c로 풀면 memo.txt.gz는 그대로 남습니다. 새로 만든 restore/memo.txt의 수정 시각은 파일을 만든 Oct 29 00:19입니다.
3️⃣ gzip 명령어 옵션
-l은 압축 파일을 풀지 않고 압축된 크기와 원래 크기, 줄어든 비율, 풀었을 때의 이름을 한 줄로 출력합니다. access.log를 -k로 다시 압축한 뒤 -l로 확인하면 아래와 같습니다.
gzip -k access.loggzip -l access.log.gz compressed uncompressed ratio uncompressed_name
4424 31878 86.2% access.log-v를 함께 붙이면 압축 방식(deflate를 줄인 defla)과 원래 데이터의 CRC, 원래 파일의 날짜와 시각이 앞에 더해집니다.
gzip -lv access.log.gzmethod crc date time compressed uncompressed ratio uncompressed_name
defla b49b41c4 Oct 28 23:50 4424 31878 86.2% access.log-t는 압축 파일이 깨지지 않았는지 검사만 하고 끝납니다. -v와 함께 쓰면 문제가 없는 파일 뒤에 [OK]가 나옵니다.
gzip -tv access.log.gzaccess.log.gz: OK-1부터 -9까지의 숫자는 압축 수준이고, 공식 매뉴얼 기준 기본값은 -6입니다. 같은 access.log를 -c로 세 번 압축해 wc -c로 크기를 비교했습니다.
gzip -c -1 access.log | wc -c5564gzip -c -6 access.log | wc -c4424gzip -c -9 access.log | wc -c4164| 압축 수준 | .gz 크기 | 원래 크기 대비 |
|---|---|---|
| 원래 파일(access.log) | 31,878바이트 | 100% |
| -1 (가장 빠름) | 5,564바이트 | 17.5% |
| -6 (기본값) | 4,424바이트 | 13.9% |
| -9 (가장 작음) | 4,164바이트 | 13.1% |
-9는 기본값보다 260바이트 작았고, -1은 기본값보다 1,140바이트 컸습니다.
폴더 이름만 적으면 [is a directory -- ignored]가 나오고, 폴더는 그대로 건너뜁니다.
gunzip configgzip: config is a directory -- ignored폴더 안의 파일을 모두 처리할 때는 -r을 붙입니다. 설정 파일 둘을 압축해 둔 config 폴더를 gunzip -r로 풀면 두 파일이 차례로 풀립니다.
gunzip -rv configconfig/app.conf.gz: 78.7% -- replaced with config/app.conf
config/site.conf.gz: 87.7% -- replaced with config/site.confls -l config/total 8
-rw-r--r-- 1 root root 840 Oct 20 11:00 app.conf
-rw-r--r-- 1 root root 528 Oct 20 11:05 site.conf-r은 폴더 안 파일을 하나씩 따로 압축하거나 풀고, 여러 파일을 하나로 묶지는 않습니다. 폴더를 압축 파일 하나로 만들 때는 tar 명령어로 묶으면서 압축합니다. tar -czf로 config 폴더를 압축하면 폴더와 두 파일이 config.tar.gz 하나에 들어갑니다.
tar -czf config.tar.gz configtar -tzvf config.tar.gzdrwxr-xr-x root/root 0 2026-10-29 00:19 config/
-rw-r--r-- root/root 840 2026-10-20 11:00 config/app.conf
-rw-r--r-- root/root 528 2026-10-20 11:05 config/site.conf📌 주요 옵션: 이 글에서 실행한 결과
| 옵션 | 하는 일 | 이 글에서 본 결과 | |
|---|---|---|---|
| -c | 결과를 표준 출력으로 내보내고 원래 파일은 그대로 둠 | -dc의 출력을 restore/memo.txt로 넘기자 45바이트 memo.txt가 생김 | |
| -d | 압축 풀기(gunzip과 같음) | access.log.gz는 없어지고 31878바이트 access.log가 다시 생김 | |
| -k | 압축하거나 푼 뒤에도 원래 파일을 남김 | memo.txt(45바이트)와 memo.txt.gz(71바이트)가 나란히 남음 | |
| -v | 파일마다 줄어든 비율과 새 파일 이름을 출력 | readme.txt: 81.5% -- replaced with readme.txt.gz | |
| -l | 압축 파일의 크기와 비율, 풀었을 때의 이름을 목록으로 출력 | 압축된 크기 4424, 원래 크기 31878, 비율 86.2%, 이름 access.log | |
| -t | 압축 파일이 깨지지 않았는지 검사 | -tv로 access.log.gz: OK, 뒷부분이 잘린 broken.gz는 unexpected end of file | |
| -r | 폴더 안의 파일을 모두 압축하거나 풂 | gunzip -rv config 한 번에 config/app.conf.gz와 config/site.conf.gz가 풀림 | |
| -f | 같은 이름의 파일이 있어도 묻지 않고 덮어씀 | 물음 없이 덮어써 memo.txt는 없고 memo.txt.gz(71바이트)만 남음 | |
| -1 ~ -9 | 압축 수준(-1 가장 빠름, -9 가장 작음, 기본값 -6) | -1, -6, -9로 압축한 출력을 wc -c로 세자 5564, 4424, 4164 |
📎 그 밖의 옵션: 공식 매뉴얼 기준
| 옵션 | 하는 일 | |
|---|---|---|
| -N | 압축할 때 원래 파일 이름과 시각을 저장하고(압축 기본값), 풀 때 저장된 이름과 시각으로 되살림 | |
| -n | 압축할 때 원래 파일 이름과 시각을 저장하지 않고, 풀 때는 .gz만 뗀 이름을 씀(풀기 기본값) | |
| -q | 경고를 모두 출력하지 않음 | |
| -S 접미사 | .gz 대신 지정한 접미사를 붙여 압축하고, 풀 때는 그 접미사를 먼저 찾음 | |
| --rsyncable | 압축 파일을 rsync로 다른 서버와 맞출 때 바뀐 부분만 보내지도록 압축 |
🔲 gzip 명령어 시뮬레이터
아래 시뮬레이터에서 gzip으로 압축하고, 압축을 풀거나 zcat과 zgrep으로 내용을 보는 과정을 직접 입력해 볼 수 있습니다.
4️⃣ gzip 파일 내용 보기
날짜를 붙여 남긴 지난 로그는 gzip으로 압축해 두면 차지하는 공간이 줄어듭니다. 아래는 하루 전 로그인 access.log-20261027을 압축하는 명령입니다.
gzip access.log-20261027압축한 로그는 풀지 않고 zcat으로 내용을 화면에 출력합니다. zcat은 gunzip -c와 같은 명령이라(공식 매뉴얼 기준) .gz 파일은 그대로 남습니다.
zcat access.log-20261027.gz | head -3192.0.2.50 - - [27/Oct/2026:00:00:00 +0000] GET / HTTP/1.1 200 15929
192.0.2.54 - - [27/Oct/2026:00:00:07 +0000] GET / HTTP/1.1 200 17699
192.0.2.4 - - [27/Oct/2026:00:00:14 +0000] GET / HTTP/1.1 200 13813zcat 출력은 파이프로 다른 명령에 넘길 수 있고, wc -l로 세면 이 로그는 600줄입니다.
zcat access.log-20261027.gz | wc -l600압축한 로그에서 특정 글자를 찾을 때는 zgrep을 사용합니다. -c를 붙이면 [ 404 ]가 들어간 줄의 수만 나오고, 줄 내용을 보려면 -c 없이 실행합니다.
zgrep -c ' 404 ' access.log-20261027.gz37zgrep ' 404 ' access.log-20261027.gz | head -3192.0.2.23 - - [27/Oct/2026:00:02:06 +0000] GET /old-page-6/ HTTP/1.1 404 229
192.0.2.38 - - [27/Oct/2026:00:04:40 +0000] GET /old-page-2/ HTTP/1.1 404 217
192.0.2.22 - - [27/Oct/2026:00:07:42 +0000] GET /old-page-6/ HTTP/1.1 404 414zcat은 압축하지 않은 파일을 받으면 [not in gzip format]을 출력하고 멈춥니다.
zcat access.log | head -1
gzip: access.log: not in gzip formatzgrep은 압축하지 않은 파일도 그대로 읽으므로, 지금 쓰는 로그와 압축해 둔 지난 로그를 한 번에 찾을 수 있습니다. 파일을 둘 이상 적으면 줄 수 앞에 파일 이름이 붙습니다.
zgrep -c wp-login.php access.log access.log-20261027.gzaccess.log:36
access.log-20261027.gz:525️⃣ gzip 오류
이미 .gz로 끝나는 파일을 다시 압축하면 [already has .gz suffix -- unchanged]가 나오고 파일은 그대로 남습니다.
gzip access.log.gzgzip: access.log.gz already has .gz suffix -- unchanged반대로 .gz로 끝나지 않는 파일을 -d로 풀면 [unknown suffix -- ignored]가 나옵니다.
gzip -d memo.txtgzip: memo.txt: unknown suffix -- ignored이름만 .gz이고 gzip으로 압축하지 않은 파일은 [not in gzip format]으로 끝납니다. 텍스트 파일인 memo.txt를 notgzip.gz라는 이름으로 복사해 풀자 이 문구가 나왔습니다.
cp memo.txt notgzip.gzgzip -d notgzip.gz
gzip: notgzip.gz: not in gzip format내려받다 끊겨 뒷부분이 잘린 .gz 파일은 [unexpected end of file]로 끝납니다. 압축한 지난 로그에서 앞 2,000바이트만 남긴 broken.gz를 -t로 검사한 결과입니다.
head -c 2000 access.log-20261027.gz > broken.gzgzip -t broken.gz
gzip: broken.gz: unexpected end of file잘린 파일이라도 zcat으로 풀면 잘린 자리 앞까지의 내용은 꺼낼 수 있습니다. 600줄 로그에서 162줄이 restore/broken.log에 남았고, 공식 매뉴얼도 깨진 압축 파일은 zcat으로 앞부분을 살리라고 안내합니다.
zcat broken.gz > restore/broken.logwc -l restore/broken.log
gzip: broken.gz: unexpected end of file
162 restore/broken.log만들 .gz 파일과 같은 이름의 파일이 이미 있으면 gzip은 덮어쓸지 묻습니다. n을 입력하면 [not overwritten]과 함께 아무것도 바꾸지 않고 끝납니다.
gzip memo.txtgzip: memo.txt.gz already exists; do you wish to overwrite (y or n)? n
not overwritten-f를 붙이면 묻지 않고 바로 덮어쓰게 됩니다. -k를 붙이지 않았으므로 memo.txt는 없어지고 memo.txt.gz만 남습니다.
gzip -f memo.txtls -l memo.txt memo.txt.gzls: cannot access 'memo.txt': No such file or directory
-rw-r--r-- 1 root root 71 Oct 28 14:30 memo.txt.gz압축을 다루다 나온 오류 문구와 다음에 확인할 것은 아래와 같습니다.
| 출력 | 뜻 | 다음에 확인할 것 |
|---|---|---|
| already has .gz suffix -- unchanged | 이미 .gz로 끝나는 파일이라 다시 압축하지 않음 | 압축할 원래 파일 이름을 적었는지 |
| unknown suffix -- ignored | .gz로 끝나지 않는 파일을 풀려고 함 | ls로 .gz 파일 이름 |
| not in gzip format | 이름은 .gz이지만 gzip으로 압축한 파일이 아님 | 실제 형식(zip·tar)과 그에 맞는 명령 |
| unexpected end of file | 압축 파일의 뒷부분이 잘림 | 원본과 크기를 비교하고 다시 받기 · zcat으로 앞부분 살리기 |
| already exists; do you wish to overwrite | 만들 파일과 같은 이름의 파일이 이미 있음 | 덮어써도 되면 y 또는 -f · 남기려면 -c로 다른 이름 |
| is a directory -- ignored | 파일 대신 폴더 이름을 적음 | 폴더 안 파일은 -r · 하나로 묶을 때는 tar |
🔢 FAQ & 추천 콘텐츠
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.