tar 압축 해제 방법, macOS 터미널에서 tar.gz와 zip 직접 풀어 보니
macOS 기본 tar로 tar 압축 해제를 직접 해 본 기록입니다. 원하는 폴더나 파일 하나만 푸는 명령, 같은 이름 파일을 덮어쓰는 결과, bz2·xz 자동 인식, 오류 메시지, Claude Code에게 명령을 물어 8.8초 만에 실행까지 확인한 과정을 담았습니다.
Finn ·

macOS에서 직접 고친 readme.md가 들어 있는 폴더에 tar -xzf project.tar.gz를 다시 실행하면 어떻게 될까요? 경고 한 줄 없이 고친 내용이 압축 파일 속 원래 내용으로 바뀝니다. tar 압축 해제는 명령 한 줄이면 끝나지만, 어디에 풀리고 무엇을 덮어쓰는지는 따로 챙겨야 하죠. macOS에 들어 있는 bsdtar 3.5.3으로 tar.gz, tar.bz2, tar.xz, zip을 하나씩 풀어 봤습니다. tar 명령은 모두 0.0초 만에 끝났고, Claude Code에게 명령을 물어 실행까지 한 단계는 8.8초가 걸렸습니다.
tar gz 압축 풀기, 어떤 명령이면 될까요?
tar.gz 파일은 tar -xzvf project.tar.gz로 풉니다. 현재 폴더가 아니라 다른 폴더에 풀고 싶다면 뒤에 -C restore처럼 폴더 이름을 붙이면 되고요. 다만 이번 실행에서 확인한 두 가지는 먼저 알고 시작하는 편이 좋습니다.
- 풀기 전에
-t로 안에 든 목록부터 보면 어떤 폴더가 생길지 미리 알 수 있습니다. - 같은 이름의 파일이 이미 있으면 기본 동작은 덮어쓰기입니다. 지키고 싶은 파일이 있다면 처음 푸는 명령에
-k를 붙여야 합니다.
| 하고 싶은 일 | 실행한 명령 |
|---|---|
| 목록만 보기 | tar -tzvf project.tar.gz |
| 현재 폴더에 풀기 | tar -xzvf project.tar.gz |
| 원하는 폴더에 풀기 | tar -xzvf project.tar.gz -C restore |
| 파일 하나만 풀기 | tar -xzvf project.tar.gz -C one project/docs/readme.md |
| 덮어쓰지 않고 풀기 | tar -xzkf project.tar.gz |
| tar.bz2, tar.xz 풀기 | tar -xvf project.tar.bz2 -C bz |
| zip 풀기 | unzip -q project.zip -d z |
그럼 실제 출력은 어땠을까요? 목록 보기부터 차례로 살펴보겠습니다.
함께 읽을 글
풀기 전에 안에 든 목록부터 보는 방법
AI 에이전트가 내려받은 압축 파일을 저장소 안에서 바로 풀면, 예상하지 못한 폴더가 생기기 쉽습니다. 그래서 풀기 전에 t로 목록부터 보는 습관이 쓸모 있어요. bsdtar 매뉴얼은 -t를 압축 파일 내용을 화면에 출력하는 모드라고 설명합니다.
$ tar -tzvf project.tar.gz
drwxr-xr-x 0 finn wheel 0 Oct 27 17:53 project/
drwxr-xr-x 0 finn wheel 0 Oct 27 17:53 project/docs/
drwxr-xr-x 0 finn wheel 0 Oct 27 17:53 project/src/
-rw-r--r-- 0 finn wheel 15 Oct 27 17:53 project/src/main.py
-rw-r--r-- 0 finn wheel 23893 Oct 27 17:53 project/src/data.txt
-rw-r--r-- 0 finn wheel 29 Oct 27 17:53 project/docs/readme.md맨 위가 project/이므로, 풀면 지금 폴더 아래에 project 폴더가 생긴다는 뜻입니다. 여기 보이는 경로는 뒤에서 파일 하나만 꺼낼 때 그대로 쓰게 됩니다.
기본 명령의 글자는 각각 무슨 뜻일까요?
목록을 확인했으니 이제 풀어 볼 차례입니다. t를 x로 바꾸면 됩니다.
$ tar -xzvf project.tar.gz && find project -type f | sort
x project/
x project/docs/
x project/src/
x project/src/main.py
x project/src/data.txt
x project/docs/readme.md
project/docs/readme.md
project/src/data.txt
project/src/main.py-xzvf는 글자 네 개를 붙여 쓴 것입니다. 뜻은 공식 문서가 설명하는 만큼만 정리하면 이렇습니다.
| 글자 | 하는 일 |
|---|---|
x | 압축 파일에서 꺼내 디스크에 풉니다 |
t | 꺼내지 않고 목록만 화면에 보여 줍니다 |
f | 뒤에 적은 파일을 압축 파일로 읽습니다 |
v | 처리하는 항목을 한 줄씩 보여 줍니다(출력의 x project/ 줄) |
z | 압축 형식을 가리키는 글자로, 이번 명령에서는 tar.gz에 붙였습니다 |
f를 빼면 어떻게 될까요? bsdtar 매뉴얼은 기본값이 시스템마다 다르다고 적고 있어서, 파일 이름 앞에는 늘 f를 붙이는 쪽이 안전합니다. GNU tar 설명서도 만들기·목록·풀기를 가장 자주 쓰는 세 동작으로, file과 verbose를 자주 쓰는 두 옵션으로 꼽아요.
원하는 폴더나 파일 하나만 풀려면?
예를 들어 저장소를 어지럽히지 않고 백업 폴더에만 풀고 싶다면 -C를 씁니다. 매뉴얼은 풀기 모드에서 압축 파일을 연 뒤, 항목을 꺼내기 전에 그 폴더로 옮겨 간다고 설명합니다. 이번 실행에서는 mkdir -p로 폴더를 먼저 만들었습니다.
$ mkdir -p restore && tar -xzvf project.tar.gz -C restore && find restore -type f | sort
x project/
x project/docs/
x project/src/
x project/src/main.py
x project/src/data.txt
x project/docs/readme.md
restore/project/docs/readme.md
restore/project/src/data.txt
restore/project/src/main.py파일 하나만 필요하다면 목록에서 본 경로를 명령 끝에 적으면 됩니다.
$ mkdir -p one && tar -xzvf project.tar.gz -C one project/docs/readme.md && find one -type f && cat one/project/docs/readme.md
x project/docs/readme.md
one/project/docs/readme.md
# 프로젝트
설명 문서눈여겨볼 점은 파일이 one/readme.md가 아니라 one/project/docs/readme.md에 생겼다는 것입니다. 파일 하나만 꺼내도 압축 파일 안의 폴더 구조는 그대로 따라옵니다.

같은 이름 파일이 있으면 덮어쓸까요?
그런데 이미 풀어 둔 폴더에서 파일을 고친 뒤 다시 풀면 어떻게 될까요? 직접 실행해 보면 고친 내용이 사라집니다.
$ echo '고친 내용' > project/docs/readme.md && tar -xzf project.tar.gz && cat project/docs/readme.md
# 프로젝트
설명 문서종료 코드는 0이었고, 덮어썼다는 안내도 없었습니다. 이럴 때는 k를 붙입니다. 매뉴얼은 -k를 풀기 모드에서만 쓰며 이미 있는 파일을 덮어쓰지 않는 옵션이라고 설명합니다.
$ echo '고친 내용' > project/docs/readme.md && tar -xzkf project.tar.gz && cat project/docs/readme.md
고친 내용에이전트에게 압축 해제를 맡긴 폴더에 직접 고친 코드가 섞여 있다면, -k가 들어갔는지부터 확인하는 편이 좋습니다. 이미 덮어쓴 다음에 붙이면 아무 소용이 없으니까요.

tar.bz2, tar.xz, zip은 어떻게 풀까요?
tar.bz2와 tar.xz는 압축 형식 글자 없이 -xvf만으로 풀어 봤습니다. 두 파일 모두 문제없이 풀렸어요.
$ mkdir -p bz xz && tar -xvf project.tar.bz2 -C bz && tar -xvf project.tar.xz -C xz && find bz xz -type f | sort
x project/
x project/docs/
x project/src/
x project/src/main.py
x project/src/data.txt
x project/docs/readme.md
x project/
x project/docs/
x project/src/
x project/src/main.py
x project/src/data.txt
x project/docs/readme.md
bz/project/docs/readme.md
bz/project/src/data.txt
bz/project/src/main.py
xz/project/docs/readme.md
xz/project/src/data.txt
xz/project/src/main.pybsdtar 매뉴얼에 따르면 -j(bzip2)와 -J(xz)는 만들기 모드 전용이고, 풀기·목록 모드에서는 무시됩니다. 읽을 때는 압축 형식을 알아서 알아챈다고 적혀 있죠. 다만 리눅스의 GNU tar에서도 글자를 빼도 되는지는 이번에 확인하지 않았습니다. 서버에서 풀 때는 그 환경에서 따로 확인해 보세요.
zip은 unzip으로 풀었고, -d로 풀 폴더를 정했습니다.
$ mkdir -p z && unzip -q project.zip -d z && find z -type f | sort
z/project/docs/readme.md
z/project/src/data.txt
z/project/src/main.py풀리지 않을 때 나오는 오류는?
파일 이름을 잘못 적었거나, 내려받다 끊긴 파일이라면 어떤 메시지가 나올까요? 두 경우 모두 종료 코드는 1이었습니다.
$ tar -xzvf nothing.tar.gz
tar: nothing.tar.gz: m: No such file or directory$ head -c 300 project.tar.gz > broken.tar.gz && mkdir -p bad && tar -xzvf broken.tar.gz -C bad
tar: Error opening archive: truncated gzip inputNo such file or directory가 보이면 파일 이름과 현재 위치를 먼저 확인하면 됩니다. truncated gzip input은 앞부분 300바이트만 잘라 만든 파일에서 나온 메시지이므로, 다운로드가 중간에 끊겼는지 의심해 볼 만합니다. 스크립트나 에이전트가 압축을 풀게 한다면 종료 코드 1을 실패로 처리하게 해 두세요.
Claude Code에게 풀기 명령을 물어보면?
마지막으로 src 폴더만 out에 푸는 명령을 Claude Code에게 한 줄로 받아, 그대로 실행해 봤습니다.
$ claude --model opus -p "맥 터미널에서 project.tar.gz 안의 project/src 폴더만 out 폴더에 푸는 명령 한 줄만 출력해. out 폴더가 없으면 만들게 하고, 설명이나 코드 블록 표시는 붙이지 마." > cmd.txt && cat cmd.txt && sh cmd.txt && find out -type f | sort
mkdir -p out && tar -xzf project.tar.gz -C out project/src
out/project/src/data.txt
out/project/src/main.py받은 명령은 폴더를 만든 뒤 -C와 폴더 경로로 src 아래 파일 두 개만 풀었습니다. 8.8초는 요청을 보내고, 받은 명령을 실행해 결과를 확인하기까지 이 단계 전체에 걸린 시간입니다.
그렇다면 받은 명령을 바로 실행해도 될까요? 이번 명령에는 -k가 없었으니, 같은 이름의 파일이 있었다면 덮어썼을 수 있습니다. 명령을 cmd.txt처럼 파일로 받았다면 sh로 돌리기 전에 한 번 읽어 보고, 지켜야 할 파일이 있을 땐 요청에 "덮어쓰지 않게"를 넣는 편이 좋습니다.
실행 환경과 이번에 확인하지 않은 것
새 임시 폴더에서 명령을 한 번씩 차례로 실행했습니다. 환경은 darwin arm64, Node.js v22.23.1, Claude Code 2.1.309이고, Claude Code는 로그인된 상태에서 --model opus로 실행했습니다. tar 버전은 다음과 같았습니다.
$ tar --version
bsdtar 3.5.3 - libarchive 3.7.4 zlib/1.2.12 liblzma/5.4.3 bz2lib/1.0.8풀어 본 파일은 아래 명령으로 만든 작은 연습 폴더입니다.
$ mkdir -p project/src project/docs && seq 1 5000 > project/src/data.txt && printf 'print("hello")\n' > project/src/main.py && printf '# 프로젝트\n설명 문서\n' > project/docs/readme.md && tar -czf project.tar.gz project && tar -cjf project.tar.bz2 project && tar -cJf project.tar.xz project && zip -rq project.zip project && rm -r project && ls -l project.*
-rw-r--r--@ 1 finn wheel 7021 Oct 27 17:53 project.tar.bz2
-rw-r--r--@ 1 finn wheel 12202 Oct 27 17:53 project.tar.gz
-rw-r--r--@ 1 finn wheel 2236 Oct 27 17:53 project.tar.xz
-rw-r--r--@ 1 finn wheel 12119 Oct 27 17:53 project.zip같은 폴더를 묶은 결과는 tar.xz 2236바이트, tar.bz2 7021바이트, zip 12119바이트, tar.gz 12202바이트였습니다. 하지만 숫자를 이어 쓴 data.txt와 작은 코드·문서 파일이 든 연습 폴더를 형식별로 한 번씩 묶은 결과일 뿐이라, 형식별 압축률을 일반화할 근거로 쓰기는 어렵습니다.

이번 실행에서 tar 명령의 소요 시간은 모두 0.0초로 기록돼, 이 기록으로 형식별 속도 차이는 비교할 수 없습니다. 리눅스의 GNU tar 동작, 큰 파일, 믿을 수 없는 곳에서 받은 압축 파일도 이번에는 다루지 않았습니다. 마지막 경우는 GNU tar 설명서에 따로 절(Extracting Archives from Untrusted Sources)이 있으니, 외부 파일을 자동으로 풀게 할 계획이라면 먼저 읽어 보세요.
참고 자료
- GNU tar 1.35.90 www.gnu.org
- man.freebsd.org/cgi/man.cgi?query=bsdtar man.freebsd.org