Daylogs/Unix

tar 와 gzip

ohgyun 2013. 6. 29. 01:42


발생일: 2013.06.28

문제:
라즈베리 파이에 node.js 를 설치하려고, `tar.gz`으로 압축된 바이너리를 다운로드 받았다.

평소였다면 아무 생각 없이 익숙한 듯 `xvzf` 옵션으로 압축 풀어서 사용했겠지만,
오늘은 금요일 밤이기도 하고 왠지 느긋한 마음에 `tar.gz`에 눈이 갔다.

그러고보니 `tar``gzip`이 정확히 뭐가 다른지 모르고 있었다.

그 오랜 시간동안, 습관적으로 `tar -xvzf`을 타이핑하면서도,
이 기본적인 걸 왜 한 번도 자세히 살펴보지 않았을까... -_-

언젠가 한 번 찾아봤던 기억이 스물스물 나긴하는데, 이미 기억의 저편으로...

여튼, 자세히 살펴보자.


해결책:


`tar.gz`은 타르 파일을 `gzip`으로 압축한 것이다.


`tar`여러 개의 파일이나 디렉토리를 하나의 파일로 묶어주는 도구이다.

예를 들면, `tar` 명령으로 디렉토리 내의 모든 txt 파일을 아래와 같이 한 파일로 묶을 수 있다.

    $ tar -cvf foo.tar *.txt  # 모든 txt 파일을 `foo.tar`로 압축한다.

`-c` 는 Create 옵션, `-v`는 Verbose 옵션, `-f`는 파일을 지정하는 옵션이다.

생성한 타르 파일에 어떤 파일이 포함되어 있는지 조회하려면 아래와 같이 `-t` 옵션을 사용하면 된다.

    $ tar -tvf foo.tar

한 번 만든 타르 파일에 다른 파일을 추가하고자 한다면, `-r` 옵션을 사용한다.
이 옵션으로 파일을 추가하거나, 기존 파일을 덮어쓸 수 있다.

    $ tar -rvf foo.tar new.txt


추가된 파일을 삭제하고 싶을 땐 아래와 같이 사용하면 된다.

    $ tar --delete -f foo.tar new.txt

참고로, 내 맥에선 위 명령이 실행되지 않는다.
기본적인 `tar` 명령이 `--delete` 옵션을 지원하지 않기 때문이다.
`--delete` 옵션은 GNU tar 에서 제공하는 기능이며, 맥에서 사용하고자 한다면 `tar` 대신 `gnutar`로 실행하면 된다.



`gzip`은 한 개의 파일을 압축하는 도구이다.

GNU zip의 약어로, 한 개의 파일을 대상으로 수행되며,
별도의 명령이 없으면 수행한 파일을 압축해서 .gz 확장자를 붙인다.

    $ gzip foo.tar

위 명령을 수행하면, `foo.bar` 파일이 `foo.bar.gz` 파일로 압축되며 "변경"된다. (새 파일이 생기는 것이 아니다)


아래와 같이 `-l` 옵션으로 압축된 파일의 상태를 조회할 수 있다.

    $ gzip -l foo.tar.gz

압축을 풀려면 `-d` 옵션을 주면 되고,

    $ gzip -d foo.tar.gz

압축했을 때처럼, `foo.tar.gz` 파일이 `foo.tar` 파일로 변경된다.


여러 개의 파일을 `tar`로 묶으면서 바로 gzip으로 압축할 수 있다.
`-z` 옵션을 사용해 아래처럼 호출하면 된다.

    $ tar -cvzf foo.tar.gz *.txt


`-z` 옵션이 `-f` 옵션보다 먼저 나온 것에 주의한다.

예를 들어,

    $ tar -cvfz foo.tar.gz *.txt

와 같이 `-z` 옵션을 `-f` 옵션 뒤에 쓰면, `-f` 옵션에 의해 z 라는 파일로 압축하라는 명령이 되어 버리기 때문이다.


마찬가지로, `-z` 옵션으로 `tar.gz`의 압축을 한 번에 풀 수도 있다.
아마 이게 가장 익숙할 것 같다. :)

    $ tar -xvzf foo.tar.gz


여튼, 핵심은 이거다.

- `tar`는 여러 개의 파일을 하나의 파일로 묶는 것.
- `gzip`은 한 개의 파일을 압축하는 것.



반응형