tarアーカイブがテキストファイルよりも大きいのはなぜですか?

25
2022.01.10

これらの2つの質問(質問1質問2 )を確認しましたが、理解するのに役立ちませんでした。 40行のHello World!文字列を含むファイルfile.txtがあります。 ls -lは、そのサイズが520バイトであることを示しています。このファイルをtar -cvf file.tar file.txtでアーカイブし、もう一度ls -lを実行すると、 file.tarが10240バイトであることがわかります。どうして?

私はいくつかのマニュアルを読み、アーカイブと圧縮は別のものであることを理解しました。しかし、誰かがそれがどのように機能しているかを説明できますか?

回答
19
2022.01.10

tarアーカイブのデフォルトの最小サイズは10240バイトです。詳細については、GNU tarのマニュアルを参照してください(ただし、これはGNU固有ではありません)。

GNU tarを使用すると、異なるブロックサイズ、異なるブロック係数、またはその両方を指定することで、これを減らすことができます。

 tar -cv -b 1 -f file.tar file.txt

file.tar店がfile.txt自体に加えて、file.txtに関するメタデータため、結果はまだ、file.txtよりも大きくなります。ほとんどの場合、ファイルのメタデータ(名前、サイズ、タイムスタンプ、所有権、権限)の1つのブロック、ファイルのコンテンツ、アーカイブの終わりのエントリの2つのブロックが表示されるため、長さゼロのファイルのサイズは4ブロックです(512バイトのブロックで2,048バイト)。

13
2022.01.10

tarは、単にファイルを保存する以外に、次の3つのことを行う必要があります。

  1. メタデータ(ファイルの名前、モード、所有者、グループ、日付など)を保存します
  2. ファイルの終わりをマークします。
  3. アーカイブの終わりをマークします。

tarは「テープアーカイブ」を意味します。テープの場合、ファイルの終わりがどこにあるかを判断することが重要であり、デバイスは検索するときでもそれを知る必要があります(テープはより速く移動します)。したがって、テープの便宜のためにtarは、すべてのファイルの最後にいくつかのゼロを追加し、アーカイブの最後に別の一連の血清を追加します。あなたが指摘した2番目の質問はこれを説明しています。

hexdump -C archive.tar |lessを使用して、アーカイブの内容を確認できます。

1
2022.01.11

もしtarに圧縮オプションのいずれかを通過しない場合でも、より一般的には、出力は入力よりも大きくされている入力(小さい少なくとも1つのファイルが存在すると仮定)が存在します。


証明:圧縮アルゴリズムが入力をより大きな出力にマップしないと仮定します。

非圧縮ファイルを回復できるようにする場合は、各入力を一意の出力にマップする必要があります。空のファイルは小さくできないため、圧縮できません。したがって、それ自体にマップする必要があります。空のファイルは空のファイルに解凍されます。

ここで、長さが1バイトのファイルについて考えます。それらは256個あります(8ビットバイトを想定)。ただし、それらを空のファイルにマップすることはできません。それ自体が解凍されることはすでにわかっています。また、大きくすることはできないため、これらはすべて1バイトのファイルに「圧縮」する必要があります(別の1バイトのファイルでもかまいませんが、小さいファイルや大きいファイルにすることはできません)。

等々。すべての(N-1)バイトファイルがすでに別のファイルに解凍されているため、Nバイトファイルを圧縮することはできません。したがって、圧縮アルゴリズムによってファイルを大きくすることができない場合は、ファイルを小さくすることもできません。 (そして、バイトではなくビットについて話す場合、証明は同様に機能します。)


それが(ちょうど大きくないではなく)すべてのファイルを小さくすることは不可能だという証明はさらに簡単です:nビット長であり、唯一の2^N - 1が長い0と(N-1)ビットの間にある合計ファイル2^Nファイルがあります。

「ほとんどの」ファイル(実際には、圧縮しようとするほとんどのファイル)を圧縮できる理由は、次の少なくとも1つが当てはまるためです。

  1. 圧縮アルゴリズムによって実際に入力が大きくなる、実際には発生する可能性が低いファイルが存在します。 (/ dev / urandomから数キロバイトを圧縮してみて、何が起こるかを確認してください。)
  2. 元のファイルを正確に復元できる必要はないため、複数の(類似した)入力が同じ出力にマップされていても問題ありません。 .jpg.mp3は、どちらも不可逆圧縮形式です。情報が失われるため、元のファイルをビットごとに再構築することはできませんが、重要な情報は保持されるため、見た目も音も正しくなります。