파일 패키징 및 압축

LinuxBeginner
지금 연습하기

소개

패키징과 압축은 서로 관련되어 있지만 다른 문제를 해결합니다. 아카이브는 디렉터리 트리를 하나의 데이터 스트림으로 결합하면서 이름과 구조를 보존합니다. 압축은 데이터를 더 작은 형태로 표현합니다. .tar 파일은 아카이브이고, .gz 파일은 gzip 으로 압축된 데이터이며, .tar.gz 파일은 gzip 으로 압축한 tar 아카이브입니다.

작은 프로젝트를 만들고 각 형식의 파일을 생성합니다. 추출하기 전에 아카이브를 검사하고, 별도의 디렉터리에 복원한 다음, 복원된 데이터와 원본을 비교합니다. 이 검사–추출–검증 작업 흐름을 사용하면 원본을 무심코 덮어쓰는 일을 방지할 수 있습니다.

보존할 디렉터리 트리 만들기

이 단계에서는 작은 원본 트리를 만들고 패키징 및 추출 후에도 보존되어야 할 항목을 확인합니다.

구성, 메모 및 데이터 디렉터리를 만듭니다.

cd /home/labex/project/archive-lab
mkdir -p source/{config,notes,data}

서로 다른 내용이 들어 있는 세 파일을 작성합니다.

printf 'mode=training\nport=8080\n' > source/config/app.conf
printf 'Archive the complete project tree.\n' > source/notes/README.txt
printf 'alpha,beta,gamma\n1,2,3\n' > source/data/sample.csv

find를 사용해 원본 디렉터리를 기준으로 일반 파일의 경로를 확인합니다.

find source -type f -printf '%P\n' | sort

Tar 아카이브 만들고 검사하기

이 단계에서는 원본 트리를 압축하지 않고 패키징한 다음, 아카이브에 포함된 구성원 이름을 확인합니다.

tar의 주요 작업 문자는 c(생성), t(목록 표시), x(추출), f(아카이브 파일 이름) 를 의미합니다. -C를 사용하면 source를 추가하기 전에 tar 의 작업 디렉터리를 변경할 수 있습니다. 이렇게 하면 긴 절대 경로가 저장되지 않습니다.

cd /home/labex/project/archive-lab
tar -cf project.tar -C /home/labex/project/archive-lab source

아카이브를 만들 때 원본 트리를 이동하는 것이 아니라 읽기만 하므로 원본 트리는 그대로 남아 있습니다. 아카이브와 원본 파일 하나를 모두 확인합니다.

ls -lh project.tar
ls -l source/config/app.conf

추출하기 전에 아카이브 구성원 목록을 확인합니다.

tar -tf project.tar > tar-members.txt
cat tar-members.txt

모든 구성원 이름은 source/로 시작해야 하며, 앞에 /가 없어야 합니다. 상대 경로로 된 구성원 이름을 사용하면 복원이 더 안전하고 이식성이 높아집니다.

안전하게 추출하고 결과 비교하기

이 단계에서는 원본 위에 추출하지 않고 비어 있는 대상 디렉터리에 추출한 다음, 두 디렉터리 트리를 비교합니다.

복원 디렉터리를 만들고 -C를 추출 대상 디렉터리로 사용합니다.

cd /home/labex/project/archive-lab
mkdir tar-restore
tar -xf project.tar -C tar-restore

복원된 경로를 확인합니다.

find tar-restore -type f -printf '%P\n' | sort

재귀적으로 비교합니다. 두 트리가 일치하면 diff -r는 아무것도 출력하지 않고 성공적으로 종료됩니다.

diff -r source tar-restore/source
echo "tar restore matches source" > tar-restore-ok.txt
cat tar-restore-ok.txt

Gzip 으로 파일 하나 압축하고 압축 해제하기

이 단계에서는 gzip 이 아카이브와 어떻게 다른지 일반 파일 하나를 대상으로 확인합니다.

원본 트리를 변경하지 않도록 파일을 복사한 다음, 복사본을 압축합니다.

cd /home/labex/project/archive-lab
cp source/data/sample.csv sample-copy.csv
gzip sample-copy.csv

기본적으로 gzip 은 입력 파일을 sample-copy.csv.gz로 바꿉니다.

ls -lh sample-copy.csv.gz
file sample-copy.csv.gz

압축을 해제한 후 원본과 내용을 비교합니다.

gunzip sample-copy.csv.gz
cmp source/data/sample.csv sample-copy.csv
echo "gzip round trip matches" > gzip-round-trip-ok.txt
cat gzip-round-trip-ok.txt

gzip 만으로는 디렉터리 트리를 패키징할 수 없습니다. 디렉터리 구조를 보존하는 역할은 tar 가 담당합니다.

압축된 Tar 아카이브 만들고 복원하기

이 단계에서는 tar 패키징과 gzip 압축을 결합합니다. z 옵션은 tar 가 아카이브 데이터를 gzip 으로 처리하도록 지정합니다.

project.tar.gz를 만들고 -tzf 옵션으로 확인합니다.

cd /home/labex/project/archive-lab
tar -czf project.tar.gz -C /home/labex/project/archive-lab source
tar -tzf project.tar.gz > targz-members.txt
cat targz-members.txt

별도의 대상 디렉터리에 추출한 다음 트리를 검증합니다.

mkdir targz-restore
tar -xzf project.tar.gz -C targz-restore
diff -r source targz-restore/source
echo "tar.gz restore matches source" > targz-restore-ok.txt
cat targz-restore-ok.txt

확장자는 사람과 도구에 파일 형식을 알려줍니다. .tar.gz는 gzip 으로 압축된 tar 아카이브임을 명확하게 나타냅니다.

프로젝트를 Zip 아카이브로 교환하기

이 단계에서는 Linux, macOS 및 Windows 에서 널리 사용하는 Zip 아카이브를 만들고 검사합니다.

zip -r은 디렉터리 트리를 재귀적으로 추가합니다. 저장되는 경로가 source/로 시작하도록 실습 루트 디렉터리에서 실행합니다.

cd /home/labex/project/archive-lab
zip -r project.zip source

추출하지 않고 구성원 목록을 확인합니다.

unzip -l project.zip

-d로 별도의 대상 디렉터리를 지정한 다음 결과를 비교합니다.

unzip -q project.zip -d zip-restore
diff -r source zip-restore/source
echo "zip restore matches source" > zip-restore-ok.txt
cat zip-restore-ok.txt

요약

패키징과 압축을 구분하고, tar 아카이브를 만들고 목록을 확인했으며, gzip 압축과 해제 과정을 완료했습니다. 또한 두 작업을 .tar.gz로 결합하고, 같은 트리를 Zip 으로 교환했습니다. 가장 중요한 점은 아카이브 생성만으로 충분하다고 가정하지 않고, 별도의 디렉터리에 복원한 뒤 콘텐츠를 비교했다는 것입니다.