수백 개 파일을 묶어 백업하거나, 용량을 줄여 전송하거나, 받은 압축 파일을 푸는 일은 끊임없이 생긴다. 그 출발점이 tar이다.
아카이브와 압축은 다르다.아카이브(archive)는 여러 파일과 디렉터리를 하나의 파일로 묶는 작업이다. 묶기만 할 뿐 크기는 거의 줄지 않는다. 압축(compression)은 데이터의 중복 패턴을 제거해 파일 크기를 줄이는 작업이다. tar는 아카이브 도구, gzip/bzip2/xz는 압축 도구이다. 둘을 결합하면 "여러 파일을 묶어서 작게" 만들 수 있다.
tar(tape archive)는 원래 테이프 백업을 위해 만들어진 도구지만, 오늘날에는 파일을 묶는 표준 도구로 쓰인다.
f 옵션 뒤에는 반드시 아카이브 파일명이 와야 하므로, 보통 cvf, xvf처럼 f를 옵션 묶음의 맨 마지막에 둔다.
tar czf backup.tar.gz에서 c(생성), z(gzip), f(파일명) 세 글자만 봐도 "gzip 압축 백업을 만든다"는 뜻을 읽을 수 있어야 한다.
⚠️ 함정: f 옵션을 빠뜨리면 안 된다tar cv archive.tar dir/처럼 f를 빠뜨리면, tar는 archive.tar를 아카이브 파일명이 아니라 묶을 대상 파일로 오해한다. 그러면 출력을 테이프 장치로 보내려다 오류가 나거나 엉뚱하게 동작한다. 거의 모든 경우 f는 필수이며, 그 바로 뒤에 파일명이 와야 한다.
현대 tar는 압축 형식을 자동 감지한다. GNU tar의 최신 버전은 tar xf archive.tar.gz처럼 z를 빼도 압축 형식을 자동으로 감지해 풀어준다. 풀 때는 z/j/J를 생략해도 되는 경우가 많다. 다만 만들 때는 어떤 압축을 쓸지 명시해야 하므로 z/j/J가 필요하다. 시험에서는 명시적 옵션을 정확히 아는 것이 안전하다.
gzip file.txt # file.txt → file.txt.gz (원본 삭제됨)gzip -d file.txt.gz # 압축 해제 (decompress)gunzip file.txt.gz # gzip -d와 동일gzip -k file.txt # 원본을 유지하며 압축(keep)gzip -9 file.txt # 최대 압축률(1=빠름, 9=최고압축)gzip -l file.txt.gz # 압축 정보(압축률 등) 표시bzip2 file.txt # file.txt → file.txt.bz2bunzip2 file.txt.bz2 # bzip2 압축 해제bzip2 -d file.txt.bz2 # 위와 동일xz file.txt # file.txt → file.txt.xzunxz file.txt.xz # xz 압축 해제xz -d file.txt.xz # 위와 동일
⚠️ 함정: gzip은 원본을 없앤다gzip file.txt를 실행하면 file.txt.gz가 생기면서 원본 file.txt는 사라진다. 압축 해제 시에도 마찬가지로 .gz 파일이 사라지고 원본이 복원된다. 원본을 함께 보존하려면 -k(keep) 옵션을 써야 한다. 이를 모르고 압축했다가 원본을 잃는 사고가 생기기 쉽다.
세 도구는 압축률과 속도가 다르다.
도구
확장자
압축률
속도
특징
gzip
.gz
보통
빠름
가장 널리 호환, DEFLATE 알고리즘
bzip2
.bz2
높음
느림
gzip보다 작게, 더 느리게
xz
.xz
매우 높음
가장 느림
최고 압축률, LZMA2 알고리즘
compress와 .Z의 역사.gzip(GNU zip)은 1992년 등장했는데, 그 이전에는 compress 명령이 표준이었다. compress는 파일을 .Z 확장자로 압축하며 uncompress로 푼다. 그러나 압축에 쓰인 LZW 알고리즘에 특허 문제가 있어, 자유 소프트웨어 진영이 특허에서 자유로운 gzip을 만들었다. 오늘날 .Z 파일은 거의 사라졌지만 시험에는 여전히 등장한다.
gzip/bzip2/xz가 단일 파일만 다루는 것과 달리, zip은 묶기와 압축을 한 번에 처리한다.
윈도우 환경과 호환되어 파일을 주고받을 때 자주 쓰인다.
zip archive.zip file1 file2 # 여러 파일을 묶고 압축zip -r archive.zip dir/ # 디렉터리를 재귀적으로 압축(recursive)unzip archive.zip # 압축 해제unzip -l archive.zip # 내용 목록만 보기(list)unzip archive.zip -d /tmp # /tmp에 풀기(destination)zip -e secure.zip file.txt # 암호를 걸어 압축(encrypt)
zip은 왜 -r이 필요할까?zip은 기본적으로 지정한 파일만 처리하며, 디렉터리를 만나면 그 안의 내용까지 자동으로 포함하지 않는다. 디렉터리 전체를 묶으려면 -r(recursive)을 명시해야 한다. tar가 디렉터리를 자동으로 재귀 처리하는 것과 대조적이다. 이 차이가 시험과 실무에서 모두 함정으로 작용한다.
리눅스의 모든 명령을 외울 수는 없다. 그래서 시스템에 내장된 매뉴얼을 활용하는 능력이 핵심이다.
man ls # ls 명령의 매뉴얼 보기man 5 passwd # 5번 섹션의 passwd 문서 (파일 형식)man -k network # network 관련 매뉴얼 검색(apropos와 동일)man -f ls # ls의 간단한 설명(whatis와 동일)
매뉴얼 페이지 안에서는 vi처럼 키로 탐색한다. Space로 다음 페이지, b로 이전 페이지, /단어로 검색, q로 종료.
man은 내용을 섹션(section)으로 나눈다. 같은 이름이 명령과 파일 형식 양쪽에 존재할 수 있기 때문이다.
섹션
내용
1
일반 사용자 명령
2
시스템 호출
3
라이브러리 함수
4
특수 파일(장치)
5
파일 형식과 설정 파일
6
게임
7
기타(매크로, 규약)
8
시스템 관리 명령
man 1 passwd vs man 5 passwd.passwd는 비밀번호를 바꾸는 명령(섹션 1)이기도 하고, 사용자 정보를 담은 파일 /etc/passwd의 형식(섹션 5)이기도 하다. 그냥 man passwd를 입력하면 보통 낮은 섹션(1, 명령)이 먼저 나온다. 파일 형식을 보려면 man 5 passwd처럼 섹션을 명시해야 한다. 이 섹션 개념은 헷갈리기 쉬운 주제이다.
info ls # ls의 info 문서 보기info coreutils # coreutils 전체 문서
man과 info의 관계. 대부분의 명령은 man과 info 양쪽에 문서를 두지만, GNU 도구들은 info 쪽이 더 자세한 경우가 많다. man이 빠른 참조용이라면 info는 튜토리얼에 가까운 상세 설명용이다. 둘 중 어느 쪽을 봐야 할지 막막하면 일단 man으로 시작하고, 부족하면 info를 참고하면 된다.
whatis ls # ls의 한 줄 설명 출력whatis cp mv # 여러 명령의 요약 한꺼번에apropos copy # "copy" 키워드를 포함하는 명령 검색apropos -s 1 network # 섹션 1에서 network 검색
whatis는 "이 명령이 뭐 하는 거지?"라는 질문에 한 줄로 답한다.
apropos는 "파일 복사하는 명령이 뭐였지?"처럼 기능으로 명령을 거꾸로 찾을 때 쓴다. apropos copy를 실행하면 cp, dd 등 복사 관련 명령이 줄줄이 나온다.
whatis와 apropos의 데이터베이스.whatis와 apropos는 매뉴얼 페이지의 제목 줄만 모아둔 데이터베이스를 조회한다. 이 데이터베이스는 mandb(또는 옛날엔 makewhatis) 명령으로 갱신된다. 새 소프트웨어를 설치했는데 whatis가 못 찾는다면, 데이터베이스가 아직 갱신되지 않았기 때문일 수 있다. man -k는 apropos와, man -f는 whatis와 완전히 같은 동작을 한다.
apropos와 whatis의 차이.whatis ls는 정확히 ls라는 이름의 명령 설명을 찾고, apropos ls는 설명에 "ls"가 들어간 모든 명령을 찾는다. 즉 whatis는 정확한 이름 매칭, apropos는 키워드 검색이다. "기능은 아는데 명령 이름을 모를 때는 apropos"라고 기억하면 헷갈리지 않는다.