分析と広告のためのCookie
分析と広告のためにCookieを使っており、どちらもGoogleに送られます。拒否しても、目に見える動作は何も変わりません。プライバシーポリシーを読む
TAR
圧縮せずにファイルをひとまとめにします。Unix での「詰める」工程で、ほぼ必ず GZ と組みます。
TAR
TAR はコンテナです。誰か別のものが符号化した流れを、中に収めておく外殻です。 長期保存とプログラム間のデータ受け渡しのために使われます。
拡張子は .tar、正式名称は Tape Archive です。ただしどちらも、そのファイルが中に何を持てるかほどには多くを語りません。このページの残りは、その中身についての話です。
1979 年までさかのぼります。 仕様は POSIX.1-2001 ustar です。
これだけ長く読まれ続けてきた形式なら、10 年後に取り出したいものを預けても大丈夫です。
仕様書がそのまま公開されているので、中身を推し量るのではなく文書を読んで実装できます。この形式が数多くのプログラムに載っているのはそのためであり、20 年前に書かれたファイルが今も開けるのもそのためです。ただし「仕様が公開されている」ことと「使用料が要らない」ことは別の話です。中でコーデックを包んでいる形式では、特許のライセンスは仕様書が答えていない別の問題として残ります。
TAR ファイルは中身をそのまま保存します。保存し直しても何も変わらないので、開いて、直して、また保存する——それを何度繰り返しても劣化は積み上がりません。これが、渡すための形式ではなく作業のための形式である理由です。
TAR ファイルはディレクトリをまるごと保存します。名前も、フォルダーも、そのあいだの構造も。メールの添付でフォルダーの代わりが務まるのはそのためです。
TAR ファイルは壊れたファイルが黙って誤読されるのではなく、壊れていると分かるようにするチェックサムを備えています。
チェックサムは何も直しません。ファイルが壊れていると教えてくれるだけです。ただしそれは、今それを知るか、送った相手から知らされるかの違いです。
tar、7-Zip、Kekaが読めますし、同じ種類のプログラムならたいてい読めます。
ファイルが開かないとき、形式が悪いことはめったにありません。たいていはプログラムのほうが形式より古いのです。もっと古い形式に変換してしまうのが確実な逃げ道で、このサイトの残りの部分はそのためにあります。
これを読めるブラウザーはありません。
これを変換するいちばんよくある理由がこれです。形式が悪いのではありません。ファイルを見せたい場所が、それを読めないというだけのことです。
TAR は、開いて手を入れるために作られています。作業が続いているあいだはこの形式でファイルを持ち、完成したものが必要になるたびに、ここから書き出してください。
繰り返し挙がる不満はこれです。中身のわりにファイルが大きくなる。
どれも、この形式を避ける理由にはなりません。どれかに不意を突かれる前に知っておくべきことがら、というだけです。これは別の主張であり、そして役に立つほうの主張です。
TAR はファイルを一つにまとめます。小さくはしません。名前は tape archive の略で、1979 年に、ディレクトリツリーを磁気テープへ一本の連続したストリームとして書き込むために設計されました。圧縮はほかの誰か、たいていはテープドライブ側の仕事でした。
TAR にまつわる混乱のほとんどはここから来ます。フォルダーの `.tar` は元のフォルダーよりわずかに大きくなります。各ファイルの前にヘッダーを加え、すべてを固定のブロックサイズに合わせて詰めるからです。小さいファイルを期待していたなら、何も間違ってはいません。まとめる道具を使っただけで、縮める道具を使ったわけではないのです。
二つの別々のプログラムが動いたからです。`archive.tar.gz` は tar によってまとめられ、そのあと一つになったファイルが gzip によって圧縮されました。`.tar.bz2` は bzip2 を、`.tar.xz` は xz を、`.tar.zst` は zstd を使いました。連鎖は右から左に読みます。圧縮を先に解き、それからまとまりを解きます。
`.tgz` と `.txz` という短い形は同じことを意味していて、一部のファイルシステムがかつてピリオドを複数持つことに難色を示していたために生まれました。小さな道具を一つずつの仕事のために組み合わせるこの構成は意図的なもので、これが TAR がそれを書くのに使われたテープドライブより長生きした理由でもあります。
この順序こそが、`.tar.gz` が同じ内容に対して ZIP をしばしば上回る理由です。ZIP は各ファイルを別々に圧縮するので、似たテキストファイルが千個あればそれぞれ孤立して絞られます。tar のあとに gzip をかけると、圧縮ツールに一本の連続したストリームを見せることになり、ファイルの境界をまたいだ繰り返しを見つけられます。
ソースコードやログファイル、似た小さいファイルがたくさんあるものではこの差は相当です。写真のフォルダーではほぼゼロです。JPEG はすでに圧縮されていて、ファイルをまたぐ繰り返しを見つける余地がないからです。この優位は本物で、しかもある種の内容に固有のものです。
まさにその連続したストリームのせいで、大きな `.tar.gz` から一つのファイルだけを取り出すのは遅くなります。索引がなく、圧縮によってバイト位置をあらかじめ計算できないので、末尾近くのファイルに到達する唯一の方法は、それより前をすべて展開することです。
ZIP は逆の取引をしました。索引はアーカイブの末尾にあり、各ファイルは独立して圧縮されているので、どの一項目もすぐに取り出せます。これが比較のすべてです。最初から読むアーカイブには TAR、つまみ食いするアーカイブには ZIP。
Unix のファイル権限、所有者、シンボリックリンクとハードリンク、それに ZIP が記録するより高い精度のタイムスタンプ。これが、ソフトウェアが ZIP ではなく `.tar.gz` として配布される理由です。展開したとき、実行可能ファイルは実行可能なままで、リンクは同じところを指したままでなければならないからです。
Windows ではそのほとんどが行き場を持たず、静かに捨てられます。何も壊れませんが、Windows で展開して再パックした `.tar.gz` は、そもそも運ぶために存在していた権限を失っています。これはアーカイブがサーバーに戻る場合には重要です。
gzip は速く、どこにでもあり、安全な既定です。ほとんどすべてがこれを生成し、ほとんどすべてがこれを読めます。xz ははっきりと硬く圧縮でき、かなり時間がかかるので、一度書かれて何度もダウンロードされるものに向いています。bzip2 はその中間に位置し、いまはほぼ過去の選択です。zstd は現代の新顔で、xz に近い圧縮率を gzip 並みの速さで達成します。
誰かに手渡すファイルなら `.tar.gz` が正しい答えのままです。上限は何がもっとも硬く圧縮できるかではなく、受け取った側が何を開けるかだからです。ほかの選択肢は、相手が何を持っているか分かっているときに選ぶ価値があります。
もとの設計はファイル名を 100 文字に固定していて、大きなファイルや長いパスの余地がありませんでした。二つの拡張がそれぞれ独立にこれを解決しました。GNU tar の方式と POSIX の pax 形式で、しかも解決の仕方が違ったので、片方が書いたアーカイブが、もう片方を厳密に期待する読み手を混乱させることがあります。
実際には現代のツールはどちらも読めるので、これはめったに表面化しません。表面化するときの症状は特徴的です。ファイル名が切り詰められる、あるいはパスが長すぎるというエラーが、ほかの点では問題のないアーカイブに対して出ます。
ソースコードのリリース、Linux と macOS のソフトウェア配布、Docker イメージのレイヤー、サーバーのバックアップ、そしてホスティング管理画面やデータベースが吐き出すエクスポートファイル。サーバーで動かすために何かをダウンロードしたことがあるなら、おそらくこの形式で届いています。
また、以前より Windows でも見かけるようになりました。Windows は 2023 年以降 `.tar.gz` をネイティブに展開でき、組み込みの tar コマンドは 2018 年からあります。一つ開くためだけにサードパーティのツールが必要だった時代は、おおむね終わりました。
アーカイブが機械ではなく人に向かうときは変換してください。Windows の同僚、ウェブのアップロードフォーム、メールの添付ファイル。ZIP はどのオペレーティングシステムも考えずに開ける形式で、それ以外を送るのは静かに相手に問題を解決させることになります。
アーカイブが Unix システムに戻るときは変換しないでください。ZIP への詰め直しは、この形式が運ぶために存在していた権限、所有者、シンボリックリンクを捨ててしまい、展開した結果がまったく動かないことがあります。サーバーのバックアップやソースリリースにとって、`.tar.gz` は迂回すべき障害物ではなく、そのアーカイブが機能する理由そのものです。
| 拡張子 | .tar |
|---|---|
| メディアタイプ | application/x-tar |
| 初版 | 1979 |
| 仕様 | POSIX.1-2001 ustar |