...
리눅스와 윈도우 파일 압축 방식
리눅스는 윈도우와는 다르게 압축과 대상 파일을 묶는 것이 따로 떨어져 있다는 개념을 가지고 있다.
윈도우에서는 보통 압축( zip )을 하면 선택된 파일이나 폴더들을 묶으면서 동시에 압축( compress )을 한다.
거의 대부분의 윈도우 압축 프로그램들은 압축시킬 대상 파일들을 압축파일이름.zip 파일 한 개로 만들면서 압축을 하는데 이걸 당연하게 생각하다보니, 리눅스에서의 동작이 생소하게 보인다.
리눅스의 경우는 압축하거나 관리할 파일들을 먼저 하나의 파일로 묶고(이걸 아카이빙이라고 한다. 이 때는 대상 파일들을 묶기만 하는 것이기 때문에 용량은 전혀 줄어들지 않는다),
이렇게 묶인 파일을 따로 추가로 압축을 해서 용량을 줄이는 방법을 사용한다.(압축방법에 따라 gz 같은 확장자를 갖는다)
아카이빙 Archiving : 단일 파일에 파일과 디렉터리들을 넣어 묶기
압축 Compression : 파일이나 아카이브가 디스크에서 차지하는 공간을 줄여주는 소프트웨어 도구 (알고리즘을 통해)
파일 아카이브
위에서 언급했듯이, 리눅스(Linux)는 파일이나 폴더들을 묶는 것(archive)과 압축(compress)하는 기능이 세분화되어 있다.
여러 파일을 한 파일로 묶은 것을 아카이브(archive)라 하며 확장자는 .tar(tape archives)를 가진다.
아카이브란 원래 보관소, 저장소라는 뜻이 지만,
리눅스에서는 '파일을 묶어서 하나로 만든 것' 이라는 의미로 사용된다.
그리고 tar(아카이브) 파일을 다시 gzip을 사용하여 압축해서 .tar.gz의 확장자를 가지는 압축 아카이브파일을
실무에서 많이 사용하고 있다.
tar는 "테이프 아카이버(Tape ARchiver)"의 요약어이다.
tar의 t(tape, 테이프)는 과거의 저장 장치인 테이프로 백업하기 위해 만들어진 프로그램이다.
그리고 tar의 ar(archive, 아카이버)은 통상적으로 "여러파일을 하나의 파일로 합치는 프로그램"을 의미한다.
즉, tar는 여러 파일을 하나로 묶을 때 사용하는 것이다. (용량변화 없이 하나로 모으는 것)
저장 장치에 파일을 저장하거나 네트워크를 통해 파일 전송할 때, 여러개의 다양한 파일들이 있으면 관리가 복잡해지기 때문에, 여러 파일을 하나로 관리하기 위한 목적으로 탄생했다.
tar이 널리 쓰이게 이유 중 한 가지는,
단순 아카이버 기능에 더해, tar로 묶여지기 전 파일들의 속성과 심볼릭 링크, 디렉터리 구조 등을 그대로 가져갈 수 있는 특징 때문이다.
그래서 최근에는 리눅스 용 프로그램, 데이터, 소스 및 라이브러리 등을 배포하는 용도로 많이 사용된다.
tar(tape archives) 명령어
tar은 여러 개의 파일을 하나의 파일로 묶거나 풀 때 사용하는 명령어이다.
tar파일은 리눅스 및 유닉스에서 가장 많이 사용되는 형태로써 tar로 묶이기 전 파일들의 속성과 디렉터리 구조등을 모두 보존할 수 있고 압축 & 압축해제 등의 작업을 거치면서 파일이 변경, 소실될 염려가 없기 때문에 소스 배포 파일을 만드는 용도로 자주 사용된다.
tar명령을 통해 만들어지는 파일은 보통 ".tar" 확장자를 갖는다.
그리고 아카이브를 gzip 또는 bzip2으로 압축된 경우, 파일 뒤에 ".gz" 또는 ".bz2" 확장자를 추가하여 ".tar.gz" 또는 ".tar.bz2"로 파일 이름을 지정할 수 있다.
드물지만 좀 더 간략하게, tar + gzip을 ".tgz"로, tar + bzip2를 ".tb2", ".tbz", "tbz2" 등으로 지정하기도 한다.
보통의 경우에는 tar을 통해 하나로 합쳐진 파일을 gzip 또는 bzip2 방식을 사용하여 압축하는데,
gzip 또는 bzip2 명령을 따로 수행하지 않고 tar 명령의 옵션만으로 처리할 수 있기도 하다.
$ tar [OPTION] [아카이브FILE명] [FILE|PATH]
옵션 | 동작 |
-f | 대상파일을 tar 아카이브 지정 (기본 옵션) |
-c | tar 아카이브 생성. 기존 아카이브 덮어 쓰기 (파일 묶을 때 사용) |
-x | tar 아카이브에서 파일 추출(파일 풀 때 사용) |
-v | 처리되는 과정(파일 정보)을 자세하게 나열 |
-z | gzip 압축 적용 옵션 |
-j | bzip2 압축 적용 옵션 |
-t | tar 아카이브에 포함된 내용 확인 |
-C | 대상 디렉토리 경로 지정 |
-A | 아카이브 파일을 tar 아카이브에 추가 |
-d | tar 아카이브와 파일 시스템 간 차이점 검색 |
-r | tar 아카이브 마지막에 파일들 추가 |
-u | tar 아카이브에 새롭게 추가된 파일만 추가 |
-k | tar 아카이브 추출 시, 기존 파일 유지 |
-U | tar 아카이브 추출 전, 기존 파일 삭제 |
-w | 모든 진행 과정에 대해 확인 요청. (interactive) |
-e | 첫 번째 에러 발생 시 중지 |
# 현재 디렉토리의 모든 파일과 디렉토리를 tar로 묶기
$ tar cvf 파일명.tar *
# 대상 디렉토리를 포함한 모든 파일과 디렉토리를 tar로 묶기
$ tar cvf 파일명.tar [PATH]
# 파일을 지정하여 tar 아카이브로 묶기
$ tar cvf 파일명.tar [FILE_1] [FILE_2]
# tar 아카이브의 내용 확인하기
$ tar tvf 파일명.tar
# tar 아카이브를 현재 디렉토리에 풀기
$ tar xvf 파일명.tar
# tar 아카이브를 지정된 디렉토리에 풀기
$ tar xvf 파일명.tar -C [PATH]
# tar 아카이브 묶거나 풀 때 파일 별 진행 여부 확인하기
$ tar cvfw 파일명.tar *
# 현재 디렉토리를 tar로 묶고 gzip으로 압축하기
$ tar zcvf 파일명.tar.gz *
# gzip으로 압축된 tar 아카이브를 현재 디렉토리에 풀기
$ tar zxvf 파일명.tar.gz
# 현재 디렉토리를 tar로 묶고 bzip2로 압축하기
$ tar jcvf 파일명.tar.bz2 *
# bzip2로 압축된 tar 아카이브를 현재 디렉토리에 풀기
$ tar jxvf 파일명.tar.bz2
파일 압축
기본적으로 리눅스의 압축 명령어는 compress, zip, gzip, bzip2, xz 가 있는데, 이중에 gzip, bzip2, xz 명령어를 주로 사용하는 편이다.
tar 명령어에서 gzip이나 bzip 등 압축 옵션을 사용할 수 있기 때문에, 압축 명령어를 단독으로 사용하는 경우는 드문 편이다.
리눅스 압축 형식
압축형태 | 기본형태 | 축약 | 간략설명 |
gzip | .tar.gz | .tgz | zip과 같은 압축 알고리즘을 사용하지만 더 용량이 작음. (다른 파일끼리의 중복되는 부분을 하나로 압축이 가능하기 때문) |
xzip | .tar.xz | .txz | LZMA2 압축 알고리즘을 사용하는 7-zip은 윈도우에서만 제공하는데 유닉스에 제공하기위해 사용됨 압축효율이 가장 좋음. |
bzip | .tar.bz2 | .tb2, .tbz, .tbz2 | 용량이 클 때, gzip에 비해 압축률은 좋지만 비교적 느림 |
Z | .tar.Z | .tZ | ASCII나 바이너리 파일을 의미 |
lzma | .tar.lzma | .tlz | bzip2보다 더 높은 압축률 제공(최대 4GB) |
.tar.lz | - | LZMA 알고리즘에 기초함 무결성을 확인하기 위한 CRC 체크섬이 지원됨 |
압축 확장자: tar, tgz(=tar.gz), bz2
압축률: tar ≪ tgz(권장) < bz2
compress 명령어
유닉스에서 많이 사용하던 압축 프로그램이다. 하지만 압축률이 낮아 현재는 거의 사용되지 않는다.
compress 명령을 통해 압축한 파일에는 .Z 확장자가 붙는다.
압축 해제는 uncompress 명령어로 하거나 compress 명령어에 옵션 -d를 붙여 압축을 해제하면 된다.
# 압축하기
$ compress [파일명]
# 압축풀기
$ uncompress [파일명]
옵션 | 설명 |
-b maxbits | 최대 비트 수를 제한 |
-c | 기본 생성 파일인 .Z가 아닌 지정한 파일로 생성 |
-d | 압축된 파일의 압축을 해제, uncompress 명령과 같은 효과 |
-f | 기존에 압축한 파일이 존재해도 이를 무시하고 압축 파일을 생성(f는 force의 약자) |
-r | 디렉터리를 압축할때 하위 디렉토리 및 하위 파일들도 같이 압축 |
-v | 압축 진행 여부를 표시 |
-V | compress 명령어의 버전 정보 출력 |
gzip / gunzip 명령어
gzip 명령어는 GNU zip의 약어로 gzip 명령어를 통해 압축이 성공하면 기존 원본 파일은 모두 사라지고 .gz 확장자를 가진 파일을 새롭게 생성한다.
Linux에서 여러 파일을 압축할 때는 tar 명령어로 파일을 묶고, gzip 명령어를 tar 명령어로 만들어진 아카이브 파일을 압축하기 때문에 단독으로 잘 쓰이지는 않는 편이다.
# gzip설치
$ apt-get install gzip
# 압축하기
$ gzip [옵션] [파일명]
# 압축풀기
$ gzip -d [파일명]
$ gunzip [파일명]
# 압축된 파일의 내용 확인
$ gzip -l [파일명]
$ zcat [파일명]
옵션 | 설명 |
-d | 압축을 풀 때 사용하는 옵션이다. |
-1 | 파일의 압축 시간을 줄인다. 이 옵션을 사용하면 압축은 빠르지만 압축률은 떨어진다. |
-9 | 파일을 최대로 압축한다. 압축률은 좋아지지만 시간이 많이 걸린다. |
-l | 압축 파일에 대한 정보를 출력하는 명령이다. |
-v | 진행 과정을 이름 및 퍼센트와 함께 자세히 보여준다. |
# test.txt 파일을 test.txt.gz 압축 파일로 압축
$ gzip test.txt
# test.txt.gz 압축 파일을 압축 해제
$ gzip -d test.txt.gz
# 두개의 파일을 동시에 압축.
# !! 각각의 파일이 독립적으로 압축하기 때문에 1개의 파일로 합쳐지는 것은 아니다.
$ gzip test.txt test1.txt
# 빠르지만 압축률이 낮은 압축 파일을 생성
$ gzip -1v test.txt
# 느리지만 압축률이 높은 압축 파일을 생성.
$ gzip -9v test1.txt
# test/ 디렉토리 아래에 있는 모든 파일을 느리지만 압축률이 높은 압축 파일로 생성하고, 생성할 때 자세한 내용 출력
$ gzip -9rv test/
bzip2 / bunzip2 명령어
버로우즈-휠러 변환이라는 블록 정렬 알고리즘과 허브만 부호화를 사용한 압축 프로그램이다.
gzip보다 압축률은 좋지만, 압축하는데 더 많은 시간이 걸린다.
bzip2로 압축하면 파일명 뒤에 .bz2가 붙고, 압축 해제는 bunzip2 명령을 사용한다.
$ bzip2 [압축 파일 이름] [압축 대상 파일, 폴더명]
#압축
$ bzip2 text.txt
# 압축 해제
$ bunzip2 text.txt.bz2
옵션 | 설명 |
-d | 압축을 풀 때 사용하는 옵션이다. |
-1 | 파일의 압축 시간을 줄인다. 이 옵션을 사용하면 압축은 빠르지만 압축률은 떨어진다. |
-9 | 파일을 최대로 압축한다. 압축률은 좋아지지만 시간이 많이 걸린다. |
-c | 결과를 표준 출력으로 보낼 때 사용한다. tar와 병행해서 작업할 때 사용한다. |
-t | 압축 파일을 검사한다. |
bzip2, bunzip2 명령어도 압축, 압축효율지정, 압축 결과를 표준 출력으로 보낼 때의 방법이 gzip, gunzip과 똑같다.
단, 생성되는 확장자만 다를 뿐이다.
xz / unxz 명령어
LZMA2라는 알고리즘을 이용하여 만든 데이터 무손실 압축 프로그램이다.
gzip 및 gzip2와 비교하여 매우 높은 압축률을 자랑한다.
높은 압축률로 인하여 최근 공개용 소프트웨어 사이트에서 이 압축 포맷을 사용하여 파일을 배포하고 있다.
xz로 압축하면 파일명 뒤에 .xz가 붙고, 압축 해제는 unxz 명령을 사용한다.
압축의 효율성으로 따지자면,
xz > bzip2 > zip > compress
의 순으로 압축이 잘되며, 당연히 압축률이 높을 수록 압축하는 시간은 더 걸린다.
그러므로 가장 비효율적인 압축명령어는 'compress'가 된다
# 압축
$ xz [옵션] [파일명]
# 압축풀기
$ xz -d [파일명]
$ unxz [옵션] [파일명]
옵션 | 내용 |
-z | 압축할 때 사용하는 옵션이다. 기본적으로 설정되어 있어서 사용하지 않아도 된다. |
-d | 압축을 풀 때 사용하는 옵션이다. |
xz, unxz 명령어도 gzip, gunzip, bzip2, bunzip2 명령어와 사용법이 동일하다.
zip / unzip 명령어
zip은 여러 파일을 묶고 압축할 수 있는 유틸리티로 tar와는 달리 아카이빙과 압축을 함께 할 수 있는 특징이 있다.
윈도우와 같이 압축 확장자 명은 .zip 이다.
또한, 이전의 압축명령어와는 달리 마치 윈도우의 zip프로그램 처럼 원본파일이 사라지지않고 그대로 남는다.
또한 윈도우에서 주로 사용하는 압축 형태인 zip 파일을 리눅스 서버로 옮겨서 작업하는 경우도 종종 있는데, 윈도우zip파일을 풀때 바로 이 직관적인 명령어를 사용 하면 된다.
$ compress, gzip, bzip2, xz
압축을 하면 원본이 사라진다.
$ zip
원본은 그대로 있되, 압축된 파일이 생긴다.
$ apt-get install zip # zip 설치
$ zip [압축 파일명][압축할 파일명]
$ unzip [파일명]
# mylog.log를 mylog.zip으로 압축하기(단일 파일 압축)
zip mylog.zip mylog.log
# mylog1.log, mylog2.log, mylog3.log를 mylog.zip으로 압축하기(다중 파일 압축)
zip mylog.zip mylog1.log mylog2.log mylog3.log
# 현 위치 디렉토리와 하위 디렉토리를 모두 test.zip으로 압축
zip -r test.zip ./*
# test.zip 압축 해제
unzip test.zip
zip 명령어 옵션
- -n : n은 1부터 9까지 숫자의 설정으로, 1이 가장 빠르지만 압축률은 가장 낮음
- -r : 하위 디렉터리까지 포함하여 압축
- -e : zip 파일에 암호 설정
- -x : 압축시 파일 제외
- -P : 압축 파일 생성 시 암호를 입력하여 생성
- -d : 지정된 위치에 압축 해제
unzip 명령어 옵션
- -a : 압축 해제 텍스트 파일을 기본적으로 자동 변환
- -L : 파일 이름을 대문자 시스템에서 소문자로 변환
- -C : 대소 문자를 구분하지 않고 이름을 일치시킴
- -o : 항상 파일을 덮어쓰기
- -n : 파일을 추출할 때 파일을 덮어쓰지 않음
압축 명령어 요약 정리
압축 | 해제 |
$ gzip file.txt | $ gunzip file.txt |
$ bzip2 file.txt | $ bunzip2 file.txt |
$ tar cvf file.tar file1.txt file2.txt | $ tar xvf file.tar |
$ zip file.zip file1.txt file2.txt | $ unzip file.zip |
$ tar cvzf file.tar.gz file1.txt file2.txt | $ tar xvzf file.tar.gz |
# 참고자료
https://recipes4dev.tistory.com/146
https://hinweis.tistory.com/54
https://gettoknowit.tistory.com/42
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.