はじめに
パッケージ化と圧縮は、関連していますが異なる問題を解決します。アーカイブは、ディレクトリツリーを名前と構造を保ったまま、1 つのデータストリームにまとめます。圧縮は、データをより小さく表現します。.tar ファイルはアーカイブ、.gz ファイルは gzip で圧縮されたデータ、.tar.gz ファイルは gzip で圧縮された tar アーカイブです。
この実験では、小さなプロジェクトを作成し、それぞれの形式でアーカイブを作成します。展開前にアーカイブを確認し、別のディレクトリに復元した後、復元データと元データを比較します。この「確認・展開・検証」の流れにより、元のファイルを何も確認せずに上書きすることを避けられます。
保持するディレクトリツリーを作成する
このステップでは、小さなソースツリーを作成し、パッケージ化と展開の後も保持されている必要がある内容を確認します。
設定、メモ、データ用のディレクトリを作成します。
cd /home/labex/project/archive-lab
mkdir -p source/{config,notes,data}
内容の異なる 3 つのファイルを作成します。
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
アーカイブの作成ではソースツリーを移動せずに読み取るだけなので、ソースツリーはそのまま残っています。アーカイブと元のファイルの 1 つを確認します。
ls -lh project.tar
ls -l source/config/app.conf
展開する前に、アーカイブのメンバーを一覧表示します。
tar -tf project.tar > tar-members.txt
cat tar-members.txt
すべてのメンバーは source/ で始まり、先頭に / が付いていないことを確認してください。相対パスのメンバー名を使うと、復元の安全性と移植性が高まります。
安全に展開して結果を比較する
このステップでは、ソースを上書きするのではなく空の展開先に展開し、2 つのツリーを比較します。
復元用ディレクトリを作成し、展開先として -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 で 1 つのファイルを圧縮・展開する
このステップでは、1 つの通常ファイルを操作し、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 による同じツリーの交換を行いました。最も重要なのは、アーカイブを作成しただけで十分だと決めつけず、別のディレクトリに復元して内容を比較したことです。



