\r\n\r\n
Tarファイルは、圧縮されたアーカイブです。UbuntuなどのLinuxディストリビューションや、macOSでターミナルを使っていると、よく遭遇することになります。ここでは、tarファイル(tarballとも呼ばれる)の内容を展開したり、解凍したりする方法を説明します。
ファイルは1つです。Tar.gzまたはa.tar bz2 拡張子は、圧縮されたアーカイブファイルです。拡張子が.tarのファイルのみ解凍されますが、これは非常にまれなケースです。
ファイル拡張子の.tarの部分はテープアーカイブを意味し、そのため両方のファイルタイプがtarファイルと呼ばれています。tarファイルの歴史は、システム管理者がファイルをテープにアーカイブできるようにtarコマンドが作成された1979年までさかのぼります。40年経った今でも、tarコマンドでtarファイルをハードディスクに展開することができる。どこかでまだ誰かがタールテープを使っているかもしれない。
.gz または .bz2 という拡張子は、アーカイブが gzip または bzip2 という圧縮アルゴリズムで圧縮されていることを示します。 tar コマンドはどちらのタイプのファイルでもうまく動作するので、bashshell が利用可能であれば、どちらの圧縮方法が使われていても利用可能なはずです。適切なtarコマンドラインオプションを使用する必要があるだけです。
例えば、2つの楽譜ファイルをダウンロードしたとします。ダウンロードディレクトリにあるukulele_song.tar.gzとguitar_song.tar.bz2というファイルです。
ウクレレの曲から抜粋してみましょう。
tar -xvzf ukulele_songs.tar.gzこれらは、ファイルを解凍した際に、ターミナルウィンドウに表示されます。
使用するコマンドラインオプションは以下の通りです。
lsでディレクトリ内のファイルをリストアップすると、Ukulele Songsというディレクトリが作成されていることがわかります。解凍されたファイルは、そのディレクトリにあります。このディレクトリはどこから来たのですか?tarファイルに含まれており、ファイルと一緒に解凍されます。
では、ギターソングを抽出してみましょう。そのために、前とほとんど同じコマンドを使いますが、ひとつだけ重要な違いがあります。.bz2という拡張子は、bzip2コマンドで圧縮されていることを表しています。ここでは、-z(gzip)オプションの代わりに、-j(bzip2)オプションを使用することにします。
tar -xvjf guitar_songs.tar.bz2ここでも、ファイルを展開する際に、ターミナル上に表示されます。わかりやすくするために、tarで使っているコマンドラインオプションはtar bz2 ファイルは
ダウンロードディレクトリのファイルをリストアップすると、Guitar Songsという別のディレクトリが作成されていることがわかります。
カレントディレクトリ以外の場所にファイルを展開するには、-C(ディレクトリを指定)オプションで展開先のディレクトリを指定します。
tar -xvjf guitar_songs.tar.gz -C ~/Documents/Songs/Documents/SongsディレクトリにGuitar Songsディレクトリが作成されていることが確認できます。
ターゲットディレクトリはすでに存在している必要があり、存在しない場合、tarはそれを作成しないことに注意してください。ディレクトリを作成し、その中にあるすべてのファイルを1つのコマンドでtarに展開させる必要がある場合、次のようにします。
mkdir -p ~/Documents/Songs/Downloaded && tar -xvjf guitar_songs.tar.gz -C ~/Documents/Songs/Downloaded/p (paints)オプションは、mkdirが必要なすべての親ディレクトリを作成し、ターゲットディレクトリが確実に作成されるようにします。
これまでは、目に見えないファイルを思い切って取り出しただけだったのです。よく考えてからにした方がいいかもしれません。tarファイルを展開する前に、-t(リスト)オプションで中身を見ることができます。lessコマンドでパイプ出力すると便利なことが多い。
tar -tf ukulele_songs.tar.gz | lessなお、ファイルの一覧表示には-zオプションは必要ありません。からファイルを展開するときだけ、-z オプションを追加すればよい。tar.gzファイルです。同様に、tar bz2ファイルの一覧表示には-jオプションは必要ありません。
出力をスクロールしてみると、tarファイル内のすべてのものがUkuleleSongsというディレクトリに格納されており、その中にファイルや他のディレクトリがあることがわかる。
ウクレレの曲のカタログには、Random Songs、Ramones、Possiblesというディレクトリがあることがわかります。
tarファイル内のディレクトリからすべてのファイルを取り出すには、以下のコマンドを使用します。なお、パスにはスペースが含まれるため、逆カンマで囲んでいます。
tar -xvzf ukulele_songs.tar.gz "Ukulele Songs/Ramones/"個別のファイルを抽出する場合は、ファイルのパスとファイル名を指定してください。
tar -xvzf ukulele_songs.tar.gz "Ukulele Songs/023 - My Babe.odt"ワイルドカードを使用して選択したファイルを抽出することができます。*は任意の文字列、?は任意の一文字を表す。ワイルドカードを使用するには、--wildcardsオプションの使用が必要です。
tar -xvz --wildcards -f ukulele_songs.tar.gz "Ukulele Songs/Possibles/B*"ハードディスク上のtarファイル内のディレクトリ構造を再現したくない場合は、--strip componentsオプションを使用します。strip components オプションは、数値の引数を取る。数値は無視するディレクトリのレベルを示す。無視されたディレクトリのファイルは抽出されますが、ディレクトリ構造はハードディスクにコピーされません。
サンプルのtarファイルで--strip components=1を指定すると、tarファイル内のトップウクレレ曲ディレクトリはハードディスクに作成されません。そのディレクトリに展開されるはずだったファイルやディレクトリは、ターゲットディレクトリに展開されることになります。
tar -xvzf ukulele_songs.tar.gz --strip-components=1この例のtarファイルでは、ディレクトリのネストは2段階だけです。したがって、--strip components=2 とすれば、すべてのファイルがターゲットディレクトリに展開され、他のディレクトリは作成されない。
tar -xvzf ukulele_songs.tar.gz --strip-components=2Linuxのマニュアルページを見ると、tarは確かに「最も多くのコマンドラインオプションを持つコマンド」というタイトルにふさわしい候補であることがわかります。tar.gzとtar bz2ファイルは粒度の細かい制御が可能で、これらのオプションはわずかしか覚えておく必要がありません。