ファイルのアーカイブと圧縮

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、targzipzip といった一般的な Linux コマンドを使用して、ファイルやディレクトリをアーカイブ(パッケージ化)および圧縮する方法を学びます。これらのツールは Linux システム上でファイルやディレクトリを管理するために不可欠であり、データを効率的に保存したり転送したりすることを可能にします。まずは基本的な操作から始め、各ステップを詳しく説明しながら、徐々に複雑なタスクへと進んでいきます。

サンプルディレクトリ構造の作成

まずは、作業の対象となるサンプルディレクトリ構造を作成することから始めましょう。これにより、さまざまな種類のファイルやディレクトリに対して、アーカイブや圧縮がどのように機能するかを理解しやすくなります。

ターミナルを開き、以下のコマンドを入力してください。

cd ~/project
mkdir -p test_dir/{subdir1,subdir2}
echo "This is file 1" > test_dir/file1.txt
echo "This is file 2" > test_dir/file2.txt
echo "This is in subdir1" > test_dir/subdir1/subfile1.txt
echo "This is in subdir2" > test_dir/subdir2/subfile2.txt

これらのコマンドの内容を解説します。

  1. cd ~/project: 現在のディレクトリをホームディレクトリ内の project フォルダに変更します。
  2. mkdir -p test_dir/{subdir1,subdir2}: test_dir という新しいディレクトリと、その中に subdir1 および subdir2 という 2 つのサブディレクトリを作成します。-p オプションを使用すると、必要に応じて親ディレクトリも同時に作成されます。
  3. echo コマンド:新しく作成したディレクトリ構造内のさまざまな場所に、サンプルテキストを含むファイルを作成します。

次に、作成した構造を確認してみましょう。

tree test_dir

もしこの出力が表示されなかったり、「command not found」というエラーが出たりしても心配いりません。システムに tree コマンドがインストールされていない可能性があります。その場合は、代わりに ls -R test_dir を使用してください。グラフィカルではありませんが、同様の構造を確認できます。

tar によるファイルのアーカイブ

サンプルディレクトリが用意できたので、次は tar コマンドを使ったファイルのアーカイブ(パッケージ化)について学びましょう。tar は「tape archive」の略で、もともとはテープドライブにアーカイブを作成するために使用されていました。現在では、複数のファイルやディレクトリを 1 つのファイルにまとめるために一般的に使用されています。

test_dir をアーカイブしてみましょう。

cd ~/project
tar -cvf test_archive.tar test_dir

このコマンドを分解して説明します。

  • tar: アーカイブを作成するために使用するコマンドです。
  • -c: 新しいアーカイブを作成(create)することを指示するオプションです。
  • -v: 「verbose(詳細)」の略です。アーカイブに追加されているファイル名を表示します。これは必須ではありませんが、何が起きているかを確認するのに役立ちます。
  • -f: 作成するアーカイブファイルの名前を指定するためのオプションです。この直後にファイル名を記述します。
  • test_archive.tar: 作成する新しいアーカイブファイルの名前です。.tar という拡張子は、tar アーカイブの慣習的な名称です。
  • test_dir: アーカイブにまとめる対象のディレクトリです。

このコマンドを実行すると、アーカイブに追加されたファイルの一覧が表示されるはずです。

アーカイブを展開せずに中身を確認するには、以下のコマンドを使用します。

tar -tvf test_archive.tar

このコマンドは、test_archive.tar という名前のファイル(-f)から、内容を詳細に(-v)リスト表示(-t)します。

tar アーカイブからのファイルの展開

tar アーカイブを圧縮する前に、アーカイブからファイルを展開(抽出)する方法を学びましょう。これは tar アーカイブを扱う上で重要なスキルです。

test_archive.tar ファイルの内容を展開するには、次のようにします。

mkdir extracted_tar
tar -xvf test_archive.tar -C extracted_tar

このコマンドを分解して説明します。

  • mkdir extracted_tar: アーカイブの内容を保存するための新しいディレクトリ extracted_tar を作成します。
  • tar: 展開に使用するコマンドです。
  • -x: アーカイブからファイルを展開(extract)することを指示するオプションです。
  • -v: 展開される各ファイルを表示する詳細モードです。
  • -f: 操作対象となるアーカイブファイルの名前を指定します。展開時には、展開したい tar ファイルのパスまたは名前を続けます。
  • -C extracted_tar: ファイルを展開する前に、extracted_tar ディレクトリに移動(change directory)することを指示するオプションです。

コマンド実行後、展開されたファイルの一覧が表示されます。

展開が正しく行われたか確認するには、以下を使用します。

tree extracted_tar

または tree が使えない場合は:

ls -R extracted_tar

これにより、アーカイブに含まれていたディレクトリ構造とファイルが表示されます。

gzip によるファイルの圧縮

tar アーカイブを作成できたので、次は gzip を使ってそれを圧縮してみましょう。

gzip test_archive.tar

このコマンドを実行すると、test_archive.tar が圧縮され、test_archive.tar.gz という名前に変更されます。元の test_archive.tar ファイルは、圧縮されたバージョンに置き換わります。

圧縮されたファイルのサイズを確認するには、以下のコマンドを使用します。

ls -lh test_archive.tar.gz

-lh オプションを使用すると、ファイルサイズが人間にとって読みやすい形式(KB、MB など)で表示されます。

なお、.tar.gz という拡張子が一般的ですが、同じ意味を持つ .tgz という拡張子が使われることもあります。

アーカイブと圧縮の違いを理解する

アーカイブ(パッケージ化)と圧縮の両方を実行したので、これらの操作の違いを理解し、ファイルサイズを比較してみましょう。

  1. アーカイブ(パッケージ化):

    • 目的:複数のファイルやディレクトリを 1 つのファイルにまとめること。
    • 動作:ファイルをグループ化し、メタデータを追加します。
    • 代表的なツール:tar (Tape Archive)
    • 結果:アーカイブの合計サイズは、多くの場合、含まれるすべてのファイルのサイズの合計よりもわずかに大きくなります。
  2. 圧縮:

    • 目的:ファイルやアーカイブのサイズを小さくすること。
    • 動作:アルゴリズムを適用してデータの冗長性を取り除き、ファイルを小さくします。
    • 代表的なツール:gzipbzip2xz
    • 結果:圧縮されたファイルは元よりも小さくなりますが、使用する前に展開(解凍)が必要です。

元のディレクトリ、tar アーカイブ、および圧縮された tar.gz ファイルのサイズを比較してみましょう。

## 元のディレクトリのサイズ(実際のファイル内容の合計サイズ)
echo "Size of the original directory (file content):"
find test_dir -type f -exec ls -l {} \; | awk '{total += $5} END {print total " bytes"}'

## tar アーカイブのサイズ(比較のために再作成します)
tar -cvf test_archive_compare.tar test_dir
echo "Size of the tar archive:"
ls -lh test_archive_compare.tar

## 圧縮された tar.gz ファイルのサイズ
echo "Size of the compressed tar.gz file:"
ls -lh test_archive.tar.gz

## 参考:ディスク使用量(ブロック/セクタのパディングを含む)
echo "Disk usage of the original directory:"
du -sh test_dir

以下の点に注目してください。

  1. tar アーカイブは、元のファイル内容の合計サイズよりもわずかに大きくなります。これは、tar がファイル名、権限、タイムスタンプ、ディレクトリ構造などのメタデータをアーカイブに追加するためです。
  2. 圧縮された tar.gz ファイルは、元のファイル群や tar アーカイブよりも大幅に小さくなります。
  3. ディスク使用量(du)は、ファイルシステムのブロック割り当てのオーバーヘッドを含むため、実際のファイルサイズとは異なる値を示すことがあります。

アーカイブ後にサイズが増加するのは正常な動作です。tar 形式は、展開時にディレクトリ構造を正しく再構築するために必要なファイルメタデータを保存するためのわずかなオーバーヘッドを追加します。このオーバーヘッドは大きなディレクトリでは無視できる程度ですが、非常に小さなファイルやディレクトリでは目立つことがあります。

一方、圧縮はデータ内の冗長性を特定して排除することで、ファイルサイズを大幅に削減します。これは特にテキストファイルや繰り返しの多い内容を含むファイルに効果的です。

圧縮アーカイブを 1 ステップで作成する

tar アーカイブを作成してから圧縮するという個別のステップを理解することは役立ちますが、実務ではこれらのステップを組み合わせることがよくあります。tar コマンドには、アーカイブの作成と同時に gzip で圧縮するためのオプションが組み込まれています。

test_dir の圧縮 tar アーカイブを 1 ステップで作成してみましょう。

cd ~/project
tar -czvf test_combined.tar.gz test_dir

このコマンドは以前使用したものと似ていますが、重要な追加点があります。

  • -z: アーカイブを gzip を使って圧縮することを tar に指示するオプションです。

生成された test_combined.tar.gz ファイルは、前の 2 つのステップで作成したものと同等ですが、一度の操作で完了しています。

この圧縮アーカイブの内容を展開せずに確認するには、次のようにします。

tar -tzvf test_combined.tar.gz

ここでの -z オプションは、gzip で圧縮されたファイルを扱っていることを tar に伝えます。

圧縮アーカイブからのファイルの展開

圧縮アーカイブを作成したので、そこからファイルを展開する方法を知っておくことも重要です。test_combined.tar.gz ファイルの内容を展開してみましょう。

mkdir extracted
tar -xzvf test_combined.tar.gz -C extracted

このコマンドを分解して説明します。

  • mkdir extracted: アーカイブの内容を保存するための新しいディレクトリ extracted を作成します。
  • tar: 展開に使用するコマンドです。
  • -x: アーカイブからファイルを展開(extract)することを指示するオプションです。
  • -z: gzip で圧縮されたファイルを扱うために必要なオプションです。
  • -v: 展開される各ファイルを表示する詳細モードです。
  • -f: 展開元のアーカイブファイルの名前を指定します。
  • -C extracted: ファイルを展開する前に、extracted ディレクトリに移動することを指示するオプションです。

コマンド実行後、展開されたファイルの一覧が表示されます。

展開を確認するには、以下を使用します。

tree extracted

または tree が使えない場合は:

ls -R extracted

これにより、アーカイブに含まれていたディレクトリ構造とファイルが表示されます。

クロスプラットフォーム互換性のための zip の使用

targzip は Linux や Unix 系システムで一般的ですが、Windows システムとの互換性を高めるために zip 形式がよく使われます。test_dir の zip アーカイブを作成してみましょう。

cd ~/project
zip -r test_archive.zip test_dir

このコマンドの動作は以下の通りです。

  • zip: zip アーカイブを作成するコマンドです。
  • -r: すべてのファイルとサブディレクトリを含めるように、再帰的(recursive)に動作させるオプションです。
  • test_archive.zip: 作成する zip ファイルの名前です。
  • test_dir: zip アーカイブに追加するディレクトリです。

このアーカイブを解凍(展開)するには、次のようにします。

unzip -d unzipped_files test_archive.zip

-d オプションは、解凍先のディレクトリを指定します。unzipped_files が存在しない場合、unzip コマンドが自動的に作成します。

zip ファイルは、事実上すべてのオペレーティングシステムで簡単に認識・利用できるという利点があり、異なるプラットフォームのユーザーとファイルを共有する際に適した選択肢となります。

まとめ

この実験では、Linux で一般的に使用されるいくつかの重要なファイルアーカイブおよび圧縮技術を学びました。

  1. 作業用のサンプルディレクトリ構造を作成し、ファイルとディレクトリの整理方法を確認しました。
  2. 圧縮なしでファイルをまとめる tar の使い方を学びました。これは複数のファイルやディレクトリを 1 つに束ねるのに便利です。
  3. アーカイブされたファイルを扱う上で不可欠な、tar アーカイブからのファイル展開方法を学びました。
  4. ストレージの節約や転送効率の向上のために、ファイルサイズを大幅に削減できる gzip による圧縮を行いました。
  5. アーカイブと圧縮の違いを学び、それぞれの目的とユースケースを理解しました。
  6. Linux システムで一般的な操作である、targzip を組み合わせて 1 ステップで圧縮アーカイブを作成する方法を学びました。
  7. アーカイブ・圧縮されたファイルを扱うためのもう一つの重要なスキルである、圧縮アーカイブからのファイル展開を練習しました。
  8. 最後に、特に Windows ユーザーとファイルを共有する際に役立つ、クロスプラットフォーム互換性の高い zip を使用したアーカイブ作成を行いました。

これらのスキルは、Linux における効率的なファイル管理、特に大量のデータを扱う場合やシステム間でファイルを転送する場合に不可欠です。圧縮によってファイルサイズを大幅に縮小できるため、ストレージや転送をより効率的に行えることを覚えておいてください。

Linux での作業を続ける中で、これらのコマンドはファイルやディレクトリを管理する上で非常に価値のあるものになるでしょう。これらの操作を繰り返し練習し、ファイルアーカイブと圧縮の技術を習得してください。