맛난호빵
tar의 유래와 자주 쓰이는 옵션 본문
tar [<옵션>...] [<파일>]...
tar 파일은 유닉스와 리눅스의 오래된 아카이브 포맷으로 유닉스 시스템 간 파일을 주고받을 때는 tar 파일로 주고받는 것이 일반적이다.
윈도우에서 흔하게 쓰이는 zip 포맷을 쓰기도 하지만 잘 쓰지 않는 이유는 일반적으로 zip 포맷이 처음 설계될 때 파일 시스템에 권한 등의 세부적인 메타데이터가 포함되는 유닉스 계열 시스템과 달리, DOS에서 시작된 포맷이기 때문에 비교적 세부 정보가 덜 기록된다. (압축 프로그램마다 다르지만 추가적으로 파일시스템의 메타데이터를 기록하는 경우도 있긴 하다.)
tar 파일은 애초에 권한이 포함된 유닉스 파일을 테이프에 담을 수 있도록 만든 포맷이기 때문에 파일 시스템의 권한 정보까지 보존되도록 설계되었다(Tape Archiver). 따라서 유닉스를 비롯해서 리눅스 진영에서는 tar를 이용해서 파일을 주고받거나 백업을 하는 등의 용도로 사용되고 있다.
옵션
주의: 이 표에서는 tar의 모든 옵션을 나열하지 않는다. 이 글은 파일을 묶고 압축하고 다시 푸는 것만 집중해서 요약한 글이다.
단축형 옵션 | 전체 옵션 | 설명 |
-c | --create | 새 아카이브 만들기 |
-r | --append | 아카이브에 파일 추가 (아카이브 끝에 추가) |
-A | --catenate --concatenate |
tar 파일 병합 |
-v | --verbose | 처리된 파일 목록 보기 |
-f | --file=<아카이브 파일 이름> | 입출력 대상 아카이브 파일 혹은 장치 (참고로 리눅스는 모든게 파일로 표현됨) |
-p | --preserve-permissions --same-permissions |
퍼미션 보존 |
-z | --gzip --gunzip --ungzip |
gzip 기반으로 tar 압축 (tar.gz) |
-J | --xz | xz 기반으로 tar 압축 (tar.xz) |
-I | --use-compress-program=<프로그램> | 압축 프로그램 지정, 멀티스레딩을 사용하려면 이를 이용해서 옵션을 주거나 다른 프로그램을 사용하는 것이 권장됨 |
압축
tar는 파일을 묶을 뿐, 자체적으로 압축을 하지 않기 때문에 다른 압축 소프트웨어의 힘을 빌어 압축하도록 되어 있다. tar와 같이 가장 많이 쓰이는 압축 포맷으로는 zip처럼 평균적인 압축 성능을 보여주는 DEFLATE 알고리즘을 사용하는 gzip, 7z처럼 강력한 압축 성능을 보여주는 LZMA2 알고리즘을 사용하는 xz 등이 있다. (bzip2 등도 있지만 사실 쓰이는 건 못 봤다.)
압축 옵션을 주고 tar를 실행해 보면 싱글 스레드만을 이용해서 압축이 진행된다는 것을 확인할 수 있다. gzip의 경우, 멀티코어 옵션이 전무하고, xz의 경우 최근의 경우 멀티코어 옵션을 제공하지만 tar의 단축 옵션으로 지정이 불가능하기 때문에 명시적으로 압축 프로그램을 지정해 주는 옵션을 사용해야 비로소 멀티코어를 온전히 활용하도록 옵션을 줄 수 있다.
gzip의 경우 'pigz'라는 추가적인 소프트웨어를 설치해서 병렬 압축을 진행할 수 있고, xz의 경우 '-T0'라고 옵션을 주어 병렬 압축을 진행할 수 있다.
tar -I pigz ...
tar -I 'xz -T0' ...
참고로 xz 압축은 정말 압축 효율이 좋지만 (평균적으로 gzip의 1/2 크기로 압축됨) 그만큼 오래 걸리는 편(거의 두 배)이기 때문에 개인적으로 gzip 기반으로 압축하는 것을 선호하는 편이다... 상황과 기호에 따라 선택해서 쓰자.
백업 용도로 한정 지어 말하자면... 다른 시스템으로 옮기는 등의 잠깐 백업을 하는 경우 gzip을 사용하고, 장기적으로 보관해야 하는 경우에는 xz 압축을 사용하는 것이 좋겠다...
자주 쓰일 옵션 조합
#gzip 압축
tar -I pigz -cvf <아카이브> <대상 폴더>
#gzip 해제
tar -I pigz -xvf <아카이브>
#xz 압축
tar -I 'xz -T0' -cvf <아카이브> <대상폴더>
#xz 해제
tar -I 'xz -T0' -xvf <아카이브>
참고로 리눅스에서 <아카이브>에 파일 경로 대신 - 를 입력하면 stdin 스트림에 출력하며 이를 다시 파일이나 네트워크로 송수신하는데 이용할 수 있음을 참고하자.
백업을 위한 원격 tar 압축
ssh와 결합해서 원격의 파일을 tar로 묶어서 로컬로 가져오는 테크닉이 있다.
ssh [<옵션>...] <접속 정보> 'tar -I pigz -cvf - <대상 경로>' > <아카이브 파일>
이렇게 하면 원격의 파일이 tar로 묶이며 stdin에 파일 내용이 출력되게 된다. '>'기호를 사용해서 stdin 스트림을 아카이브 파일에 리디렉션 해주면 ssh를 통해 넘어온 stdin이 아카이브 파일에 저장된다.
반대로 로컬의 tar 파일을 원격에 넘겨서 푸는 상황을 상정해보자면...
cat <아카이브 파일> | ssh [<옵션>...] <접속 정보> 'tar -I pigz -xvf - <대상 경로>'
이 경우 로컬에서 cat으로 읽혀진 파일이 stdout에 출력되며 파이프를 뜻하는 '|'기호를 통해 ssh에 stdin으로 전달된다. 전달된 stdin을 원격에서 해제하면 덧씌워지게 된다.
다만 이런식으로 진행할때 sudo를 사용하기 어렵다는 문제점이 있다... 이 문제는 아에 ssh로 접속 후 역으로 PC로 보내는 방식을 쓰거나 파일로 저장한 후 scp 명령을 통해 가져오는 방식을 쓰는게 보안상 이로울 것 같다. 비밀번호를 sudo에 stdin으로 보내는 방법이 있겠지만... 비밀번호가 bash 히스토리에 기록되서 유출될 수도 있기 때문에 굳이 한다면 sh 스크립트를 작성하는 것에 응용하는 방향으로 쓰는게 좋을 듯 하다...