
53.tarコマンドで大量のファイルを一つにまとめよう
ナックス「世界が憎しみと怒りに満ちている……」
デビー君「…………」
ナックス「少年よ。なぜ世界から争いは無くならないのだろうな……。人々が手と手を取り合って一つになることはできないものか……」
ナックス「その答えを求め、私は旅に出た。世界をこの足で歩き、世界をこの目で見て、世界をこの体で感じてきた」
ナックス「そして、答えを見つけた──」
デビー君「なに?」
ナックス「というわけで、今回は世界を一つにするコマンドです」
デビー君「えぇっ!?」
ナックス「今回のコマンドは tar コマンド!!」
デビー君「たー?」
ナックス「たー!!」
$ tar cvf アーカイブ [ファイル名|ディレクトリ名]
デビー君「アーカイブって何?」
ナックス「複数のものを一つにまとめたモノの事です」
ナックス「というわけで、えーっと適当にディレクトリを作成して」
$ mkdir tar_test
「その中で前回のシェルスクリプトでも使って、適当に画像ファイルを取得しておきましょう」
$ cp getImage.sh tar_test/.
$ cd tar_test
$ ./getImage.sh イヌ
「『前回のコードとかいうのをコピペしてみたけど、エラーがでて動かないよ!』って言う方はcurlコマンドをインストールしてください」
「"コマンドをインストール"と聞くと、何やら特殊なインストールをしないといけない気がするかもしれませんが、普通のパッケージ(ソフトウェアのこと)と同じインストール方法でインストールできます」
デビー君「とりあえず、適当にたくさん取得しました(前回のシェルスクリプトを使用すると大量に画像が取得できますが、サムネイル画像の例では、解説を分かりやすくするため、少数の画像で例示しています)」
$ ls
ナックス「はい。その画像たち(と、ついでに前回作成した画像ダウンロードシェルスクリプト)ですが、一見仲良さそうに見えますよね?」
デビー君「??」
ナックス「しかし、彼らは憎しみあっています」
デビー君「!!?」
ナックス「そんな彼らをひとつにする。それがtarコマンド!ディレクトリの中でこの様にコマンドを打ってみてください」
$ tar cvf peace.tar *
デビー君「ぐおっ。実行したら、一瞬すべての画像ファイルの名前が表示されて、peace.tarっていうファイルが出来た」
$ ls
ナックス「そうです。平和(peace)の名の下に、彼らは今、一つになったのです」
ナックス「ちなみに、さっきのコマンドの最後の * (アスタリスク)は、ワイルドカードでディレクトリ内のすべてのファイルを指定しています」
ナックス「ひとつひとつファイルを指定する場合は、以下のような感じにコマンドを打ちます」
$ tar cvf peace.tar inu.jpg neko.jpg kotori.jpg
ナックス「あ。ちなみに、本来はアーカイブファイルのファイル名はなんでもいいです。最後に.tarってつけるのは慣例になっていますが」
デビー君「えっと、peace.tarっていうファイルにひとまとめになったっぽいのは分かった」
ナックス「はい」
デビー君「でも、元の画像ファイルも残ってるよ?」
ナックス「はい。"ひとまとめにする"と聞くと、すべての画像ファイルが消えて、ひとつのアーカイブファイルになるようにイメージしてしまうかもしれませんが、実際はアーカイブファイルを作っても元のファイルが消えることはありません」
デビー君「へー。あと、cvfっていうのがあるよね?これ、オプションでしょ?何を指示してるの?」
ナックス「まずはc!これは create の c。"アーカイブファイルを作ってね"と言う意味です」
ナックス「次にv!これは "処理したファイルの一覧を詳しく見せてね"と言う意味です。さっきデビー君が言った"ぐおっ。実行したら、一瞬すべての画像ファイルの名前が表示されて"の箇所は、vオプションを使用しているから表示しているのです」
ナックス「つまり、別にvオプションをつけなくても特に問題があるわけではないのですが、まあどのファイルをアーカイブしたか確認出来るのでつけた方がいいですね」
デビー君「へー」
ナックス「最後がf。これは、"アーカイブファイルもしくはデバイスの指定"……つまり、指定したアーカイブファイル名にアーカイブファイルを作るよ、ってことです」
デビー君「なるほど」
ナックス「さて。このtarファイル。一般に"tar玉"とか"tarball"とか言われます」
デビー君「へー」
ナックス「そして、このtar。実は、ひとまとめにしただけで、圧縮してません」
デビー君「えっ?そうなの?」
ナックス「はい。圧縮とはファイルサイズを小さくする技術の事ですが、このtarは、全部のファイルをまとめたサイズをそのまま持っています。ls -lとかでファイルサイズを確認してみてください。なかなかのビッグサイズのままなはずです」
$ ls -l peace.tar -rw-r--r-- 1 garunimo garunimo 1392640 2012-12-22 14:29 peace.tar
デビー君「おー。確かに試してみたら、僕の場合1392640という、なかなかのビッグサイズだったよ」
ナックス「さらに、ひとまとめにしただけ、っていうことで、(多分)Linuxの場合、フォルダの中身をみるGUI環境から、tarファイルを選択したら、アーカイブしたものの画像をそのまま見ることが出来ます。ぜひ試してみてね」
デビー君「へー」
ナックス「さて。"ひとまとめにしたけど、元に戻したいときはどうするの?"って話です」
デビー君「話ですね」
ナックス「新しくディレクトリを作って、その中にpeace.tarファイルを移動してください。でないと、その場でアーカイブファイルを元に戻しちゃうと、元々ある画像ファイルとアーカイブファイルを元に戻して新しく出てくるファイルがごっちゃになるので」
デビー君「はーい」
$ mkdir tar_test2
$ mv peace.tar tar_test2
$ cd tar_test2
デビー君「新しくディレクトリを作って、その中にpeace.tarファイルを移動しました」
ナックス「lsコマンドで、現在ディレクトリの中にはpeace.tarしか無いことを確認して」
$ ls
ナックス「以下のコマンドを使用してください」
$ tar xvf peace.tar
ナックス「lsで確認してください」
$ ls
デビー君「おおっ!アーカイブしてた画像が出てきた!」
ナックス「はい。新しく出てきたxオプションは"アーカイブを展開"の意味です」
デビー君「なるほどねー」
ナックス「さて、このtarコマンド。例えば、ファイルをひとまとめにして、誰かにメールで添付ファイルで送りたい、って時とかに使います。あと、例えばメールの添付ファイルでディレクトリを添付することは出来ませんが、tarコマンドでディレクトリを指定すると、ディレクトリをtarファイル、というファイルの形式にしてくれるので、そのようにtar玉にして添付ファイルで送る、みたいな事も出来ます。あとは、単純にファイルの整理とかにも使用します。今回の例ではたまたま画像ファイルをアーカイブしましたが、当然txtファイルや他の形式のファイルにも使えます」
デビー君「……で、一体このtarコマンドでどうすれば人類は一つになるの?」
ナックス「こうします」
$ tar cvf 地球 *
ナックス「こうすれば、世界は一つに……!!」
デビー君「ナックス、冷静に考えて。そのコマンドは既に神様が世界を作ったときに実行済みだよ?」
ナックス「次回こそ圧縮コマンドの解説(54.gzipコマンドで圧縮しよう)!!」