매일 업데이트
2022-11-16 10:17 13 min

시스템 관리자 및 개발자를 위한 15가지 tar 명령 예

tar는 유닉스 및 리눅스 환경에서 널리 쓰이는 파일 묶음 형식입니다.

원래 이름은 테이프 장치에 데이터를 순차적으로 저장하기 위해 개발된 "Tape ARchive"에서 유래되었습니다. 때로는 tarball이라고 불리기도 합니다.

기본적으로 tar는 파일들을 압축하지 않고 묶는 역할을 합니다. 하지만 다양한 압축 기법을 적용하여 압축된 결과물을 만들 수 있습니다. tar 유틸리티는 대부분의 리눅스 배포판에 기본적으로 포함되어 있으며, 파일 형식 자체는 윈도우, macOS 등 다른 운영체제에서도 다양한 도구와 유틸리티를 통해 지원됩니다.

이 글에서는 tar 명령어의 일반적인 사용법과 함께 다양한 플래그들을 예시와 함께 알아보겠습니다.

시작해 볼까요?

tar 아카이브 생성

압축되지 않은 tar 아카이브를 생성하기 위한 기본적인 명령어 형식은 다음과 같습니다.

$ tar cvf <아카이브-파일명> <묶을-파일들>

여기서 c 플래그는 생성을, v는 자세한 출력, f는 tar 아카이브 파일 이름을 지정하는 것을 의미합니다. 관례적으로 tar 파일은 .tar 확장자를 사용합니다. 아카이브에 묶을 파일들은 와일드카드를 사용하거나 개별 파일명 또는 경로를 지정할 수 있습니다.

예를 들어, 제 디렉토리에는 다음 세 개의 파일이 있습니다.

$ ls -l
total 12
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
$

이 세 파일을 모두 포함하는 tar 아카이브를 만들고 싶다면 다음과 같이 할 수 있습니다.

$ tar cvf archive.tar *
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
$

특정 파일만 아카이브에 담고 싶을 때는 다음과 같이 지정할 수 있습니다.

$ tar cvf archive1.tar file1.txt file2.txt
file1.txt
file2.txt
$ ls -l archive1.tar
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive1.tar
$

압축된 아카이브(GZ) 생성

tar는 단순히 파일을 묶을 뿐만 아니라 압축하여 저장 공간을 절약할 수 있습니다. 가장 널리 사용되는 압축 형식 중 하나는 gunzip이며, 일반적으로 .tar 다음에 .gz 확장자를 붙이거나 .tgz로 표기합니다. z 플래그를 사용하면 gunzip을 사용하여 파일을 압축하도록 지정할 수 있습니다. 예시는 다음과 같습니다.

$ tar cvzf archive.tar.gz file*
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar archive.tar.gz
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair   188 Sep 12 20:21 archive.tar.gz
$

두 아카이브 파일 모두 같은 세 개의 파일을 포함하고 있지만, 파일 크기가 크게 다르다는 것을 알 수 있습니다. 이는 z 플래그를 사용하여 압축을 했기 때문입니다.

압축된 아카이브 생성(BZ2)

tar는 다양한 압축 형식을 지원합니다. 그 중 하나가 bz2 또는 bzip2이며, 확장자는 .tar.bz2 또는 때때로 .tbz2로 표시됩니다. bz2는 더 작은 아카이브 크기를 제공할 수 있지만, 압축 및 압축 해제 과정에서 더 많은 CPU 자원을 소모하여 gz 형식보다 느릴 수 있습니다.

예시:

$ tar cvjf archive.tar.bz2 file*
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar archive.tar.gz archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair   212 Sep 12 20:25 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair   188 Sep 12 20:21 archive.tar.gz
$ file archive.tar*
archive.tar:     POSIX tar archive (GNU)
archive.tar.bz2: bzip2 compressed data, block size = 900k
archive.tar.gz:  gzip compressed data, from Unix, original size modulo 2^32 10240
$

모든 파일 압축 해제

tar 아카이브(압축 여부와 상관없이)는 x 옵션을 사용하여 간단하게 압축을 풀 수 있습니다. 아래 예시는 그 사용법을 명확히 보여줍니다.

$ tar xvf archive.tar
file1.txt
file2.txt
file3.txt
$ ls -l
total 24
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 19 18:25 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair    13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair    19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair    24 Sep 12 20:08 file3.txt
$

gz 압축 아카이브의 경우에도 동일하게 작동합니다.

$ tar xvf archive.tar.gz
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 19 18:27 archive.tar.gz
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

bz2 압축 아카이브도 마찬가지입니다.

$ tar xvf archive.tar.bz2
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

tar 내용 목록 확인

tar 아카이브의 내용을 확인하고 싶다면 t 플래그를 다음과 같이 사용합니다.

$ tar tvf archive.tar.bz2
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$

특정 파일 압축 해제

tar 또는 tar.gz, tar.bz2 아카이브에서 특정 파일 하나만 추출하고 싶다면, 다음과 같이 파일명을 지정합니다.

$ tar xvf archive.tar.bz2 file1.txt
file1.txt
$ ls -l
total 8
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
$

마찬가지로, 공백으로 구분하여 여러 파일 이름을 지정하면 여러 파일을 한 번에 추출할 수 있습니다.

$ tar xvf archive.tar.bz2 file1.txt file3.txt
file1.txt
file3.txt
$ ls -l
total 12
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

와일드카드를 사용하여 압축 해제

와일드카드 패턴을 사용하여 하나 이상의 파일을 추출하고 싶다면 --wildcards 플래그를 사용합니다.

$ tar xvf archive.tar.bz2 --wildcards "file*"
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

아카이브에 파일 추가

새로운 파일들은 r 또는 --append 플래그와 함께 새 파일 이름 또는 와일드카드 패턴을 사용하여 기존의 압축되지 않은 tar 아카이브에 추가할 수 있습니다. (압축되지 않은 .tar 파일에만 해당되며, tar.gz 또는 tar.bz2 와 같은 압축 형식에서는 작동하지 않습니다.)

$ tar rvf archive.tar file-new*
file-new.txt
file-new2.txt
$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new2.txt
$

archive.tar의 내용을 확인하면 새로 추가된 두 파일이 추가된 것을 볼 수 있습니다.

아카이브에서 파일 삭제

--delete 플래그를 사용하면 tar 아카이브에서 특정 파일을 제거할 수 있습니다. 아래는 파일 삭제 전후의 tar 목록을 비교한 것입니다.

$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new2.txt
$ tar --delete -f archive.tar file-new.txt file-new2.txt
$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
$

이 기능 역시 압축되지 않은 tar 파일에만 적용되며, 압축된 아카이브 형식에서는 작동하지 않습니다.

확인하며 생성하기

압축되지 않은 tar 파일을 생성할 때 W 플래그를 사용하면 아카이브 내용을 확인할 수 있습니다.

$ tar cvfW archive.tar file*.txt
file1.txt
file2.txt
file3.txt
Verify file1.txt
Verify file2.txt
Verify file3.txt
$

이 명령으로 생성된 tar 파일은 나중에 gzip 등의 도구를 사용하여 압축할 수 있지만, 압축 플래그와 함께 사용할 수는 없습니다.

tar를 특정 폴더에 압축 해제

현재 디렉토리가 아닌 특정 폴더에 tarball 내용을 추출하려면, 디렉토리 경로와 함께 -C 플래그를 사용합니다.

$ tar xvf archive.tar -C new-directory/
file1.txt
file2.txt
file3.txt
file2.txt
file4.txt
$ ls -l new-directory/
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 15 Sep 19 18:59 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
-rw-r--r-- 1 abhisheknair abhisheknair 10 Sep 19 18:58 file4.txt
$

diff 플래그 사용

--diff 또는 d 플래그를 사용하여 tar 아카이브의 파일과 파일 시스템의 파일 간의 변경 사항을 확인할 수 있습니다. 아래 예시는 먼저 tar 내부와 외부 파일이 동일할 때 실행한 결과입니다. 그 다음 파일 내용을 변경한 후 다시 실행하여 차이점을 보여줍니다.

$ tar dvf archive.tar file4.txt
file4.txt
$
$ echo newline > file4.txt
$
$ tar dvf archive.tar file4.txt
file4.txt
file4.txt: Mod time differs
file4.txt: Size differs
$

파일 제외

tar 아카이브를 생성할 때 특정 파일을 제외해야 할 때가 있습니다. 이럴 때는 --exclude 플래그를 사용합니다.

$ tar --exclude="dir/file2.txt" --exclude="dir/file-new*.txt" -cvzf archive.tar.gz dir/
dir/
dir/file1.txt
dir/file3.txt
$ ls -l dir
total 24
-rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new.txt
-rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:20 file-new3.txt
-rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:27 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 6 Sep 19 19:27 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 8 Sep 19 19:27 file3.txt
$ tar tvf archive.tar.gz
drwxr-xr-x abhisheknair/abhisheknair 0 2021-09-19 19:30 dir/
-rw-r--r-- abhisheknair/abhisheknair 5 2021-09-19 19:27 dir/file1.txt
-rw-r--r-- abhisheknair/abhisheknair 8 2021-09-19 19:27 dir/file3.txt
$

위의 출력에서 볼 수 있듯이, --exclude 플래그를 여러 번 지정하여 여러 파일 이름 또는 패턴을 AND 조건으로 지정할 수 있습니다. 참고로, 위의 예시에서는 dir 폴더에 있는 6개의 파일 중 2개만이 archive.at.gz에 포함되는 조건을 만족했습니다.

tar 콘텐츠 크기 보기

압축된 tar 아카이브의 내용 크기를 확인하려면 다음과 같은 명령을 사용합니다.

$ tar tvf archive.tar.gz
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$ tar -xzf archive.tar.gz --to-stdout|wc -c
56
$

bz2 아카이브의 경우도 마찬가지입니다.

$ tar tvf archive.tar.bz2
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$ tar -xjf archive.tar.bz2 --to-stdout|wc -c
56
$

권한 유지

기본적으로 tar 명령은 아카이브되는 파일 및 디렉토리의 권한을 유지합니다. 하지만 -p 플래그 또는 --preserve-permissions를 사용하여 명시적으로 동일한 권한을 지정할 수도 있습니다.

$ tar cvpzf archive.tar.gz *.txt
file1.txt
file2.txt
file3.txt
$

요약 👨‍💻

tar는 오랜 기간 동안 유닉스/리눅스 시스템에서 유용하게 사용되어 온 유틸리티이며, 주로 아카이브 및 백업 작업에 사용됩니다. 시간이 지남에 따라 다양한 옵션이 추가되어 발전해 왔습니다. tar가 제공하는 기능을 숙지하고 있다면 단순하거나 복잡한 다양한 작업에 활용할 수 있습니다. 이 글에서는 tar 명령으로 수행할 수 있는 몇 가지 기본적인 작업들을 소개했으며, 일상적인 시스템 관리 작업에서 tar 명령이 어떻게 도움이 될 수 있는지 보여주었습니다.

더 자세한 내용을 알고 싶다면 man tar 명령을 사용하거나, tar --help 또는 tar --usage 명령을 통해 도움말을 참조하십시오.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.