Linux의 .tar.gz 또는 .tar.bz2 파일에서 파일을 추출하는 방법

Tar 파일은 여러 파일을 하나로 묶어 놓은 아카이브 형태입니다. 리눅스 배포판인 Ubuntu나 macOS 환경에서 터미널을 사용할 때 종종 접하게 되죠. 여기서는 tar 파일, 흔히 tarball이라고 불리는 파일의 압축을 풀고 내용을 추출하는 방법에 대해 알아보겠습니다.

.tar.gz 와 .tar.bz2 파일의 의미

.tar.gz 또는 .tar.bz2 확장자를 가진 파일은 압축된 아카이브 파일입니다. 반면, 확장자가 .tar인 파일은 압축되지 않은 형태로, 이 경우는 흔하지 않습니다.

파일 확장자 중 .tar 부분은 ‘테이프 아카이브’를 의미하며, 이는 tar 명령이 처음 만들어진 1979년으로 거슬러 올라갑니다. 당시 시스템 관리자들이 테이프에 파일을 저장하는 데 사용했죠. 40년이 지난 지금도 우리는 tar 명령을 사용하여 하드 드라이브에 있는 tar 파일을 추출하고 있습니다. 어쩌면 여전히 누군가는 테이프와 함께 tar를 사용하고 있을지도 모르겠네요.

.gz 또는 .bz2 확장자는 각각 gzip 또는 bzip2 압축 알고리즘을 사용하여 아카이브가 압축되었음을 나타냅니다. tar 명령은 이 두 가지 유형의 파일 모두를 잘 처리하므로, 어떤 압축 방식이 사용되었는지는 크게 중요하지 않습니다. Bash 셸 환경이라면 어디서든 사용할 수 있습니다. 올바른 tar 명령 옵션만 사용하면 됩니다.

Tar 파일에서 내용 추출하기

만약 여러분이 두 개의 악보 파일을 다운로드했다고 가정해 봅시다. 하나는 ukulele_songs.tar.gz, 다른 하나는 guitar_songs.tar.bz2입니다. 이 파일들은 다운로드 디렉토리에 저장되어 있습니다.

먼저 우쿨렐레 악보를 추출해 보겠습니다.

tar -xvzf ukulele_songs.tar.gz

파일 압축이 풀리면 터미널 화면에 추출된 파일 목록이 표시됩니다.

위 명령에서 사용된 옵션은 다음과 같습니다.

-x: 압축 해제 및 tar 파일에서 파일 추출
-v: verbose 모드, 추출되는 파일 목록 표시
-z: gzip, gzip을 사용하여 tar 파일 압축 해제
-f: file, tar 명령이 처리할 tar 파일의 이름. 이 옵션 뒤에는 반드시 tar 파일 이름이 와야 합니다.

ls 명령어로 디렉토리 내용을 확인하면, ‘Ukulele Songs’라는 새로운 디렉토리가 생성되었음을 알 수 있습니다. 추출된 파일들은 이 디렉토리 안에 있습니다. 이 디렉토리는 어디서 왔을까요? 바로 tar 파일 내부에 포함되어 있었고, 파일들과 함께 추출된 것입니다.

이제 기타 악보를 추출해 봅시다. 이전과 거의 동일한 명령어를 사용하지만, 중요한 차이점이 하나 있습니다. .bz2 확장자는 bzip2 명령어로 압축되었음을 나타내므로, -z (gzip) 옵션 대신 -j (bzip2) 옵션을 사용해야 합니다.

tar -xvjf guitar_songs.tar.bz2

마찬가지로, 파일 압축이 풀리면서 터미널에 파일 목록이 표시됩니다. 명확히 하기 위해, .tar.bz2 파일에 사용된 옵션들을 정리하면 다음과 같습니다.

-x: 압축 해제 및 tar 파일에서 파일 추출
-v: verbose 모드, 추출되는 파일 목록 표시
-j: bzip2, bzip2를 사용하여 tar 파일 압축 해제
-f: file, tar 명령이 처리할 tar 파일의 이름

다운로드 디렉토리를 확인하면 ‘Guitar Songs’라는 새로운 디렉토리가 생성된 것을 볼 수 있습니다.

파일 추출 위치 지정하기

만약 현재 디렉토리가 아닌 다른 위치에 파일을 추출하고 싶다면, -C (지정 디렉토리) 옵션을 사용하여 대상 디렉토리를 지정할 수 있습니다.

tar -xvjf guitar_songs.tar.gz -C ~/Documents/Songs/

Documents/Songs 디렉토리를 보면, ‘Guitar Songs’ 디렉토리가 생성된 것을 확인할 수 있습니다.

주의할 점은, 대상 디렉토리는 반드시 미리 존재해야 합니다. 만약 디렉토리가 없다면 tar 명령은 디렉토리를 자동으로 생성하지 않습니다. 디렉토리를 생성하고 tar 명령으로 파일들을 동시에 추출하고 싶다면 다음과 같이 해야 합니다.

mkdir -p ~/Documents/Songs/Downloaded && tar -xvjf guitar_songs.tar.gz -C ~/Documents/Songs/Downloaded/

-p (parents) 옵션을 사용하면, mkdir 명령이 필요한 모든 상위 디렉토리를 생성하여 대상 디렉토리가 만들어지도록 합니다.

압축 해제 전, Tar 파일 내용 확인하기

지금까지 우리는 압축 해제를 먼저 하고 파일 내용을 확인했습니다. 하지만 파일을 추출하기 전에 미리 내용을 살펴보고 싶을 수도 있습니다. 이럴 때는 -t (목록) 옵션을 사용하여 압축을 풀기 전에 tar 파일 내용을 미리 확인할 수 있습니다. 일반적으로 less 명령과 함께 사용하여 결과를 확인하는 것이 편리합니다.

tar -tf ukulele_songs.tar.gz | less

파일 목록을 볼 때는 -z 옵션은 사용할 필요가 없습니다. -z 옵션은 .tar.gz 파일에서 파일을 추출할 때만 필요합니다. 마찬가지로 .tar.bz2 파일의 목록을 확인할 때도 -j 옵션은 필요하지 않습니다.

출력 결과를 살펴보면, tar 파일 내의 모든 항목들이 ‘Ukulele Songs’라는 디렉토리 안에 있고, 그 안에는 다시 파일과 다른 디렉토리들이 있음을 알 수 있습니다.

또한, ‘Ukulele Songs’ 디렉토리 안에 ‘Random Songs’, ‘Ramones’, ‘Possibles’ 라는 하위 디렉토리들이 포함되어 있다는 것을 확인할 수 있습니다.

tar 파일 내부의 특정 디렉토리에서 모든 파일을 추출하려면, 다음과 같이 경로를 따옴표로 감싸서 명령어를 실행해야 합니다 (경로에 공백이 포함되어 있으므로).

tar -xvzf ukulele_songs.tar.gz "Ukulele Songs/Ramones/"

만약 특정 파일 하나만 추출하고 싶다면, 해당 파일의 경로와 이름을 정확하게 지정하면 됩니다.

tar -xvzf ukulele_songs.tar.gz "Ukulele Songs/023 - My Babe.odt"

와일드카드 문자를 사용하여 특정 패턴에 해당하는 파일을 선택적으로 추출할 수도 있습니다. 여기서 *는 임의의 문자열을, ?는 단일 문자를 의미합니다. 와일드카드를 사용하려면 –wildcards 옵션을 추가해야 합니다.

tar -xvz --wildcards -f ukulele_songs.tar.gz "Ukulele Songs/Possibles/B*"

디렉토리 구조 없이 파일 추출하기

tar 파일의 디렉토리 구조를 그대로 복원하지 않고 파일만 추출하고 싶다면, –strip-components 옵션을 사용할 수 있습니다. 이 옵션은 숫자 매개변수를 필요로 하는데, 이 숫자는 무시할 디렉토리 수준을 나타냅니다. 무시된 디렉토리 내부의 파일들은 여전히 추출되지만, 디렉토리 구조는 하드 드라이브에 복제되지 않습니다.

예를 들어, 예제 tar 파일에 –strip-components=1 옵션을 적용하면, tar 파일 내의 최상위 디렉토리인 ‘Ukulele Songs’ 디렉토리가 하드 드라이브에 생성되지 않습니다. 해당 디렉토리 안에 있던 파일 및 하위 디렉토리들은 지정된 대상 디렉토리로 바로 추출됩니다.

tar -xvzf ukulele_songs.tar.gz --strip-components=1

예제 tar 파일에는 두 단계의 디렉토리 중첩만 있습니다. 따라서 –strip-components=2 옵션을 사용하면, 모든 파일이 대상 디렉토리에 바로 추출되고, 디렉토리는 전혀 생성되지 않습니다.

tar -xvzf ukulele_songs.tar.gz --strip-components=2

리눅스 매뉴얼 페이지를 보면, tar 명령은 “가장 많은 명령줄 옵션을 가진 명령어” 라는 타이틀에 어울리는 후보임을 알 수 있습니다. 다행히도, .tar.gz 및 .tar.bz2 파일에서 파일들을 추출하는 데에는 몇 가지 옵션만 기억하면 됩니다.