Linux 터미널에서 파일을 압축하거나 압축을 푸는 방법

ZIP 파일은 윈도우, macOS, 리눅스 시스템에서 널리 사용되는 보편적인 압축 방식입니다. 리눅스 터미널 명령 몇 가지를 활용하여 ZIP 아카이브를 생성하거나 내용을 추출할 수 있습니다.

ZIP 압축 아카이브 파일 형식의 중요성

ZIP 파일은 윈도우 환경에서 압도적인 점유율을 자랑하며, 전 세계적으로 가장 널리 사용되는 압축 아카이브 형식일 것입니다.

.tar.gz 및 tar.bz2 파일이 리눅스에서 자주 사용되지만, 윈도우 사용자는 주로 ZIP 형식으로 아카이브를 공유합니다. 따라서 파일을 보관하고 윈도우 사용자에게 전달해야 할 때, ZIP 형식은 모든 사용자에게 가장 간편하고 호환성이 뛰어난 해결책입니다.

zip, unzip 및 관련 도구들

리눅스와 macOS 같은 Unix 계열 운영체제에는 ZIP 파일을 생성하고 압축을 해제하는 데 필요한 도구들이 기본적으로 포함되어 있습니다. 이뿐만 아니라 zipcloak, zipdetails, zipsplit, zipinfo 등 다양한 관련 유틸리티도 존재합니다.

일부 리눅스 배포판에서는 이러한 유틸리티들이 기본 설치에 포함되어 있습니다. 예를 들어 Ubuntu 19.04, 18.10, 18.04 및 Manjaro 18.04에서는 모든 유틸리티를 사용할 수 있습니다. 반면 Fedora 29와 CentOS의 경우 zip 및 unzip만 제공됩니다.

만약 Fedora 29에서 누락된 요소를 설치하려면 다음 명령어를 실행하세요.

sudo dnf install perl-IO-Compress

CentOS 7에서 필요한 요소를 설치하려면 다음 명령어를 사용하세요.

sudo yum install perl-IO-Compress

만약 언급되지 않은 리눅스 배포판에서 zip 유틸리티가 없다면, 해당 배포판의 패키지 관리 도구를 사용하여 필요한 패키지를 설치하시기 바랍니다.

zip 명령어로 ZIP 파일 만들기

ZIP 파일을 생성하려면 zip 명령어에 아카이브 파일 이름과 포함할 파일을 지정해야 합니다. 아카이브 이름에 “.zip” 확장자를 추가하지 않아도 되지만, 추가해도 무방합니다.

현재 디렉토리의 모든 C 소스 코드 파일(*.c)과 헤더 파일(*.h)을 포함하여 source_code.zip 이라는 파일을 만들려면 다음 명령을 실행합니다.

zip source_code *.c *.h

파일이 추가될 때마다 목록이 표시됩니다. 파일 이름과 해당 파일에 적용된 압축 정도를 확인할 수 있습니다.

새로 생성된 ZIP 아카이브를 보면 “.zip” 파일 확장자가 자동으로 추가되었음을 확인할 수 있습니다.

ls -l source_code.zip

ZIP 파일 생성 시 zip 명령어의 출력을 보고 싶지 않다면 -q (자동) 옵션을 사용하십시오.

zip -q source_code *.c *.h

ZIP 파일에 디렉토리 포함하기

ZIP 파일에 하위 디렉토리를 포함시키려면 -r (재귀) 옵션을 사용하고 명령줄에 해당 하위 디렉토리의 이름을 지정해야 합니다. 다음과 같이 이전과 동일한 방법으로 ZIP 파일을 만들고 ‘archive’ 하위 디렉토리도 포함할 수 있습니다.

zip -r -q source_code archive/ *.c *.h

ZIP 파일을 추출할 사용자를 고려하여 내부 파일이 특정 디렉토리에 포함된 형태로 ZIP 파일을 만드는 것이 일반적입니다. 이렇게 하면 ZIP 파일을 받은 사람이 압축을 해제할 때 모든 파일이 컴퓨터의 폴더에 정돈되어 저장됩니다.

다음 명령어는 현재 작업 디렉토리와 모든 하위 디렉토리를 아카이브합니다. 이 명령어는 작업 폴더의 상위 디렉토리에서 실행됩니다.

zip -r -q source_code work/

압축 수준 설정

파일이 ZIP 아카이브에 추가될 때 적용되는 압축 정도를 설정할 수 있습니다. 압축 수준은 0에서 9까지이며, 0은 압축을 전혀 하지 않음을 의미합니다. 압축 수준이 높을수록 ZIP 파일을 만드는 데 시간이 더 오래 걸립니다. 적당한 크기의 ZIP 파일이라면 시간 차이가 크게 느껴지지 않지만, 기본 압축 수준(6)으로도 충분할 것입니다.

특정 압축 수준을 사용하려면 -와 함께 숫자를 명령줄 옵션으로 전달하면 됩니다.

zip -0 -r -q source_code work/

기본 압축 수준은 6이며, -6 옵션을 명시적으로 지정하지 않아도 되지만 지정해도 문제가 없습니다.

zip -r -q source_code work/

최대 압축 수준은 9입니다.

zip -9 -r -q source_code work/

여기서 압축하지 않은 경우(레벨 0)와 기본 압축(레벨 6) 간의 차이는 약 400KB입니다. 기본 압축과 최대 압축 수준(레벨 9) 간의 차이는 불과 4KB입니다.

미미하게 보일 수 있지만, 수백, 수천 개의 파일이 포함된 아카이브의 경우, 파일당 약간의 추가 압축만으로도 상당한 공간 절약 효과를 볼 수 있습니다.

ZIP 파일에 암호 추가

ZIP 파일에 암호를 추가하는 것은 간단합니다. -e (암호화) 옵션을 사용하면 암호를 입력하고 확인을 위해 다시 입력하라는 메시지가 표시됩니다.

zip -e -r -q source_code work/

unzip 명령어로 ZIP 파일 압축 해제

ZIP 파일에서 파일을 추출하려면 unzip 명령어를 사용하고 ZIP 파일의 이름을 입력해야 합니다. 이때 “.zip” 확장자를 명시해야 합니다.

unzip source_code.zip

파일이 추출되면 터미널 창에 목록이 표시됩니다.

ZIP 파일에는 파일 소유권 정보가 포함되어 있지 않으므로, 압축 해제된 모든 파일의 소유자는 파일을 추출한 사용자로 설정됩니다.

zip 명령어와 마찬가지로 unzip 명령어에도 -q (자동) 옵션이 있어 파일 추출 시 파일 목록을 보지 않아도 됩니다.

unzip -q source_code.zip

특정 디렉토리에 파일 추출

파일을 특정 디렉토리에 추출하려면 -d (디렉토리) 옵션을 사용하고 아카이브를 풀 경로를 지정해야 합니다.

unzip -q source_code.zip -d ./development

암호로 보호된 ZIP 파일 추출

암호로 생성된 ZIP 파일을 풀려면 암호를 입력하라는 메시지가 표시됩니다. 올바른 암호를 입력하지 않으면 파일이 추출되지 않습니다.

unzip -q source_code.zip

만약 암호가 노출되는 것이 중요하지 않거나 명령 기록에 저장되는 것을 신경 쓰지 않는다면 -P (암호) 옵션을 사용하여 명령줄에 암호를 직접 입력할 수 있습니다. (대문자 “P”를 사용해야 합니다.)

unzip -P fifty.treacle.cutlass -q source_code.zip

특정 파일 제외

특정 파일이나 파일 그룹을 추출하지 않으려면 -x (제외) 옵션을 사용합니다. 다음 예제에서는 “.h” 확장자로 끝나는 파일을 제외하고 모든 파일을 추출합니다.

unzip -q source_code.zip -x *.h

파일 덮어쓰기

만약 아카이브를 추출했지만 실수로 추출된 파일 중 일부를 삭제했다면, 파일을 다시 추출하여 복구할 수 있습니다. 하지만 이전에 압축을 풀었던 디렉토리에서 다시 압축을 풀려고 하면, unzip 명령어는 파일 덮어쓰기 여부를 묻는 메시지를 표시합니다. 다음과 같은 응답을 선택할 수 있습니다.

‘r’ (이름 변경) 응답을 제외하고 나머지 응답들은 대소문자를 구분합니다.

y: 예, 파일을 덮어씁니다.
n: 아니오, 파일을 덮어쓰지 않습니다.
A: 모두 덮어씁니다.
N: 모두 덮어쓰지 않습니다.
r: 이름을 변경하고 파일을 추출합니다. 새 이름을 입력하라는 메시지가 표시됩니다.

만약 압축 해제 시 기존 파일을 덮어쓰도록 하려면 -o (덮어쓰기) 옵션을 사용하면 됩니다.

unzip -o -q source_code.zip

가장 효율적인 방법은 대상 디렉토리에 없는 파일만 압축을 해제하는 것입니다. 이를 위해서는 -n (덮어쓰지 않음) 옵션을 사용하면 됩니다.

unzip -n source_code.zip

ZIP 파일 내부 내용 보기

압축을 해제하기 전에 ZIP 파일 내에 포함된 파일 목록을 확인하는 것은 유용합니다. -l (목록 아카이브) 옵션을 사용하여 이를 확인할 수 있습니다. 출력을 관리하기 쉽게 하기 위해 less 명령어를 통해 파이핑할 수 있습니다.

unzip -l source_code.zip | less

출력 결과는 ZIP 파일 내부의 디렉토리 및 파일, 파일 크기, 아카이브에 추가된 시간과 날짜를 보여줍니다. less에서 빠져나오려면 ‘q’ 키를 누르세요.

이 외에도 ZIP 파일 내부를 탐색하는 다양한 방법이 있습니다.

zipcloak 명령어로 암호 추가하기

만약 ZIP 파일을 만들었지만 암호를 추가하는 것을 잊었다면, zipcloak 명령어를 사용하여 ZIP 파일에 암호를 빠르게 추가할 수 있습니다. 명령줄에서 ZIP 파일 이름을 지정하면 암호를 입력하라는 메시지가 표시됩니다. 암호는 확인을 위해 다시 한번 입력해야 합니다.

zipcloak source_code.zip

zipdetails 명령어로 파일 정보 보기

zipdetails 명령어는 ZIP 파일에 대한 많은 정보를 표시합니다. 이 명령어가 출력하는 정보의 양이 많으므로, less 명령어를 통해 파이핑하는 것이 합리적입니다.

zipdetails source_code.zip | less

ZIP 파일이 암호로 보호되어 있는 경우에도, 출력되는 정보에는 파일 이름이 포함되어 있습니다. 이러한 정보는 ZIP 파일에 메타데이터로 저장되며, 암호화된 데이터의 일부가 아닙니다.

zipgrep 명령어로 파일 내부 검색하기

zipgrep 명령어를 사용하면 ZIP 파일 내부의 파일을 검색할 수 있습니다. 다음 예제에서는 ZIP 파일 내에서 “keyval.h”라는 텍스트를 포함하는 파일이 있는지 확인합니다.

zipgrep keyval.h source_code.zip

결과를 보면 slang.c와 getval.c 파일에 “keyval.h” 문자열이 포함되어 있다는 것을 알 수 있습니다. 또한 이 파일들의 복사본이 서로 다른 디렉토리에 두 개씩 있다는 것도 알 수 있습니다.

zipinfo 명령어로 정보 보기

zipinfo 명령어는 ZIP 파일 내부를 확인하는 또 다른 방법을 제공합니다. 앞서와 마찬가지로, 출력을 less 명령어를 통해 파이핑합니다.

zipinfo source_code.zip | less

출력 결과는 왼쪽에서 오른쪽으로 다음과 같은 정보를 보여줍니다.

파일 권한
ZIP 파일을 만드는 데 사용된 도구 버전
원본 파일 크기
파일 설명자 (아래 설명)
압축 방식 (이 경우 디플레이션)
데이터 및 타임스탬프
파일 및 모든 디렉토리의 이름

파일 설명자는 두 개의 문자로 구성됩니다. 첫 번째 문자는 텍스트 파일인지 이진 파일인지 여부를 나타내는 ‘t’ 또는 ‘b’입니다. 대문자인 경우 파일이 암호화되어 있음을 의미합니다. 두 번째 문자는 다음 4가지 문자 중 하나일 수 있으며, 해당 파일에 포함된 메타데이터 유형 (없음, 확장 로컬 헤더, “추가 필드”, 또는 둘 다) 을 나타냅니다.

-: 둘 다 존재하지 않을 경우, 하이픈으로 표시됩니다.
l: 확장 로컬 헤더만 존재하는 경우.
x: 확장 로컬 헤더는 없지만 추가 필드가 있는 경우
X: 확장 로컬 헤더와 추가 필드 모두 존재하는 경우.

zipsplit 명령어로 파일 분할

만약 ZIP 파일을 다른 사람에게 보내야 하는데 파일 크기 제한이나 전송에 문제가 있는 경우, zipsplit 명령어를 사용하여 원본 ZIP 파일을 더 작은 ZIP 파일 세트로 분할할 수 있습니다.

-n (크기) 옵션을 사용하여 새로운 ZIP 파일 각각의 최대 크기를 설정할 수 있습니다. 다음 예에서는 source_code.zip 파일을 분할하며, 새로운 ZIP 파일은 100KB (102400바이트)를 초과하지 않도록 설정합니다.

zipsplit -n 102400 source_code.zip

선택한 크기는 ZIP 파일에 있는 파일 크기보다 작을 수 없습니다.

이러한 명령어를 사용하면 Linux 터미널을 벗어나지 않고도 다양한 작업을 수행할 수 있으며, 자신만의 ZIP 파일을 만들거나 받은 ZIP 파일의 압축을 해제할 수 있습니다.