tarはアーカイブを作成するコマンドだ。
アーカイブとは、複数のファイルを1つのファイルにまとめて書庫管理するファイルのことだ。
よく勘違いをするのだが、アーカイブする作業だけなら、ファイル圧縮は行わない。
このページではアーカイブの考え方と管理方法を解説する。
キーワードとして「アーカイブ」「圧縮」「解凍」「展開」という言葉が出てくる。この4つの言葉はコンピュータを使うすべての人にとってポイントとなるワードなので覚えておいてほしい。
併せて、tarコマンドと他の圧縮に関するコマンドとの違いを十分に把握してほしい。
目次
- 1 アーカイブとは
- 2 tarコマンドの歴史
- 3 tarコマンドのオプションたち
- 3.1 tarコマンド全般で使う共通オプション
- 3.2 アーカイブするオプション
- 3.3 解凍するオプション
- 3.4 圧縮するアーカイブに関するオプション
- 3.5 その他オプション
- 3.6 -fオプション(--file=ARCHIVEオプション):アーカイブファイル名を指定する
- 3.7 -vオプション(--verboseオプション):アーカイブ結果を表示する
- 3.8 -wオプション(--interactiveオプション, --confirmationオプション):操作を行うかの確認メッセージを表示する
- 3.9 --show-defaultsオプション:tar の既定値を表示
- 3.10 -cオプション(--createオプション):アーカイブを新規に作成
- 3.11 オプション -r, オプション --append:アーカイブに新たなファイルを追加
- 3.12 -uオプション(オプション --update):新しいファイルのみがアーカイブされる
- 3.13 -Aオプション,(--catenateオプション, --concatenateオプション):tarアーカイブされたファイルの内容を追加する
- 3.14 --deleteオプション:アーカイブファイル内からファイルを削除する
- 3.15 --suffix=STRINGオプション:バックアップのアーカイブファイルの作成
- 3.16 --remove-filesオプション:アーカイブに追加した元ファイルを削除する
- 3.17 -Vオプション(--label=TEXTオプション):アーカイブにボリューム名を設定する
- 3.18 --Cオプション(--directory=DIRオプション):アーカイブ元のファイルのディレクトリを指定する
- 3.19 --totalsオプション:アーカイブ後に書きだしたバイト数を表示
- 3.20 --utcオプション:ファイルの更新時刻を表示
- 3.21 -Wオプション(--verifyオプション):アーカイブを書き出した後に検証
- 3.22 -xオプション(--extractオプション, --getオプション):アーカイブされたファイルを解凍し展開・復元を行う
- 3.23 --keep-newer-filesオプション:解凍した際に変更日時の新しいファイルを置き換えない
- 3.24 --overwriteオプション:解凍する場合に既存のファイルを置き換える
- 3.25 -Uオプション(--unlink-firstオプション):解凍する時に該当のファイルを削除する
- 3.26 --recursive-unlinkオプション:解凍する時に該当のディレクトリを削除にする
- 3.27 --to-command=COMMANDオプション:アーカイブから取り出したファイルをプログラムで開く
- 3.28 --mオプション(オプション--touch):アーカイブのファイルの更新時刻を現在時刻とする
- 3.29 --delay-directory-restoreオプション:すべての解凍が終了するまでファイルの属性を変えない
- 3.30 -Oオプション(--to-stdoutオプション):アーカイブから取り出したファイルを標準出力に表示
- 3.31 -jオプション(--bzip2):bzip2形式で圧縮する
- 3.32 -zオプション(--gzip):gzip形式で圧縮する
- 3.33 --gunzipオプション:圧縮されたアーカイブを解凍する
- 3.34 -tオプション(--listオプション):アーカイブの内容を一覧表示
- 3.35 -Mオプション(--multi-volumeオプション):アーカイブを分割する
- 3.36 --test-labelオプション:アーカイブのボリューム情報を表示する
- 4 関連コマンド
アーカイブとは
先にも書いたが、アーカイブは複数のファイルを1つのファイルにまとめて管理するファイルに変換することだ。
アーカイブされたファイルはファイルとしては、そのまま内容を読み出すことができない。
内容を読み出すには、アーカイブ前の元のファイルの状態に戻す作業が必要だ。
この作業を「解凍」または「展開」と呼ぶ。どちらかというとファイルを圧縮しつつアーカイブしたものを元の形に復元するのが「解凍」、圧縮してないアーカイブの場合は「展開」のようなニュアンスだ。
複数のファイルを1つのファイルにまとめる作業は、一般的にはある数学的な操作でファイルサイズを小さくする「圧縮」という形で行われるのだが、tarコマンドはアーカイブするだけで圧縮は行わない。
コンピュータにはせっかく圧縮という仕組みがあってファイルにまとめればファイル容量も少なくなるにもかかわらず、圧縮しないアーカイブという考え方があるのだろうか。
いくつかの例を挙げてみよう。
圧縮すればファイルの構造が変化する
圧縮するということは、当然ながら圧縮されたファイルは元のデータとは全く違う形のファイルとなり、まれにではあるが、正常に圧縮されない場合もある。
後で解凍しようとしても何かの不具合で解凍できないなどのリスクがある。
圧縮と解凍したときにコンピュータに負担がかかる
最近のコンピュータは高性能化しているのであまり実感がないが、例えば1GBを超えるような巨大なビットマップファイルを500個圧縮しようとしたら、圧縮には相当時間がかかるだろう。
はじめから圧縮されているファイルではさらに圧縮する必要がない。
画像ファイルを例に挙げるが、ビットマップファイルは無圧縮の画像ファイルなので、圧縮すればかなりファイルサイズを小さくすることができる。
しかし、JPEGやPNGなどのすでに圧縮されているファイルに対して圧縮を行ってもほとんど圧縮されず、1ファイルにまとめるという意味しか持たない場合がある。しかもこの場合は、圧縮作業をするので先に書いた「ファイル内容が変わる」ということが起きるためにデメリットの方が多くなる可能性もある。
圧縮とは
圧縮とは、ファイルの内容を数学的に計算して本来のファイル容量よりも小さくする技術のことだ。
圧縮には2通りあり、可逆性圧縮と不可逆性圧縮がある。
可逆性圧縮は、あとで元の形に再現するように計算し圧縮をしているので、あとから元のままのデータを取り出すことができる。
不可逆性圧縮は、元ファイルの何かを犠牲にすることでファイル容量を抑える方法だ。有名なものだとJPEG画像圧縮は画像の劣化を伴い、元に戻すことができない。
アーカイブで扱われる圧縮は、可逆性圧縮で元のままのファイルに戻すことができる。
アーカイブと圧縮の違いのまとめ
以上のような理由から、圧縮は若干であるがデメリットが存在したり、そもそも意味がなかったりする場合がある。
ここに1ファイルにまとめるだけのアーカイブのメリットがあるのだ。
例えば、大量のJPEG画像がある場合、圧縮率はほとんど0なのでメリットが少ない。
クラウドのファイルサーバーやメールで送信する場合、1ファイルごとに送信するのでは、手間がかかる。
事前にアーカイブしておけばファイルを大量に指定する必要もなく1回の指定で済む。
Linuxではファイル名に慣例的に.tarの拡張子を付けて管理することもポイントとして覚えておこう。
なお、tarコマンドを実行した場合、特にオプションを設定しなければ、アーカイブ元のファイルも消えることなく残る。
元のファイルが不必要な場合はしかるべきオプションにてアーカイブ作成と同時に削除するか、作業後にrmコマンドなどで削除すればよいが、ケースによっては安全にアーカイブされたことを確認してから削除しても良いのかも知れない。
tarコマンドの歴史
tarコマンドはもともとUNIX系のOSで使われていた書庫管理プログラムだ。
昔の銀行などのUNIXのシステムは、今のように大容量のディスクの好きな位置に記録できるような時代ではなく、磁気テープといってデータを追加する場合は今まであったデータの後に記録されるような仕組みになっていた。
データ上では、途中の行に挿入して記録することが不可能だったのだ。
tarコマンドは、その時代の名残が色濃く残っている数少ないコマンドだ。
解説を読む上で、そのような歴史があることを頭の片隅に入れておいてほしい。
tarコマンドは現在のコンピュータシステムでは想像もできないような古い技術にも対応しているのだ。
もしも、あなたがこの解説を読み進める上で想像できないような用語、解説があった時は、ぜひその用語について調べ、先人たちの技術にぜひ触れてみてほしい。
tarコマンドのオプションたち
tarコマンドはオプションを指定して使う。
オプションはどんな順番で入力しても構わないが、-fオプションだけはアーカイブファイル名を示すものなので必ずfの直後は半角スペースを挟んでファイル名が入力されていなければならない。
オプションの書式として、「-cvf ファイル名」は問題ないが、「-cfv ファイル名」は無効になる。注意しよう。
後から詳細をご紹介するが、まずは一覧で見てみよう。
tarコマンド全般で使う共通オプション
オプション -f(オプション --file=ARCHIVE)
アーカイブファイル名を指定する
オプション -v(オプション --verbose)
アーカイブ結果を表示する
オプション -w(オプション --interactive, オプション --confirmation)
操作を行うかの確認メッセージを表示する。
オプション --show-defaults
tar の既定値を表示
アーカイブするオプション
オプション -c(オプション --create)
アーカイブを新規に作成
オプション -r(オプション --append)
アーカイブに新たなファイルを追加
オプション -u(オプション --update)
新しいファイルのみがアーカイブされる
オプション -A(オプション --catenate, オプション --concatenate)
tarアーカイブされたファイルの内容を追加する
オプション --delete
アーカイブファイル内からファイルを削除する
オプション suffix=STRING
バックアップのアーカイブファイルの作成
既存のアーカイブファイルと同名のアーカイブファイルがあったときに、上書き保存されるが、同時に古いアーカイブファイルをsuffixで指定した文字を連結したファイル名で作成する。
アーカイブを確認するオプション
オプション --remove-files
アーカイブに追加した元ファイルを削除する
オプション -V(オプション --label=TEXT)
アーカイブにボリューム名を設定する
オプション -C(オプション --directory=DIR)
アーカイブ元のファイルのディレクトリを指定する
オプション --totals
アーカイブ後に書きだしたバイト数を表示
オプション--utc
ファイルの更新時刻を表示
オプション -W(オプション --verify)
アーカイブを書き出した後に検証
解凍するオプション
オプション -x(オプション --extract, オプション --get)
アーカイブされたファイルを解凍し展開・復元を行う
オプション -k(オプション --keep-old-files)
解凍した際に既存のファイルを置き換えない。
アーカイブされているファイルと同じディレクトリで同じ名前のものがあった場合、スキップし置き換えない。
オプション --keep-newer-files
解凍した際に変更日時の新しいファイルを置き換えない
オプション --overwrite
解凍する場合に既存のファイルを置き換える
オプション -U(オプション --unlink-first)
解凍する時に該当のファイルを削除する
オプション --recursive-unlink
解凍する時に該当のディレクトリを削除にする
-Uオプションでは解凍前にファイルを削除した。
--recursive-unlinkオプションはそのディレクトリ版だ。
一度、解凍先のディレクトリを削除してから解凍する。
オプション --to-command=COMMAND
アーカイブから取り出したファイルをプログラムで開く
オプション -m(オプション--touch)
アーカイブのファイルの更新時刻を現在時刻とする
オプション--delay-directory-restore
すべての解凍が終了するまでファイルの属性を変えない
オプション -O(オプション --to-stdout)
アーカイブから取り出したファイルを標準出力に表示
圧縮するアーカイブに関するオプション
tarコマンドでは、アーカイブ時に同時に圧縮を行うこともできる
本来は圧縮専用のコマンドがあり、そちらを使うことがスタンダードではあるが、tarコマンドのオプションにも圧縮するものがあることを覚えておいてほしい。
ファイルの拡張子は自動では付与されないので、指定しなければならない。
オプション -j(オプション --bzip2)
bzip2形式で圧縮する。
オプション-z(オプション --gzip)
gzip形式で圧縮する。
オプション--gunzip
gzip形式で圧縮されたアーカイブを解凍する
その他オプション
オプション -t(オプション --list)
アーカイブの内容を一覧表示
オプション -M(オプション --multi-volume)
アーカイブを分割する
オプション -d(オプション --diff, オプション --compare)
アーカイブ元とアーカイブファイルの違いをチェックする
オプション --test-label
アーカイブのボリューム情報を表示する
では、詳細を見ていこう、
-fオプション(--file=ARCHIVEオプション):アーカイブファイル名を指定する
-fオプション直後にファイル名は記述するので、-fオプションは全オプションの最後に記述することになるだろう。
tarコマンドは、ほとんどの場合、アーカイブ名を指定しなければならないので、-fオプションは必須のオプションだ。
-vオプション(--verboseオプション):アーカイブ結果を表示する
tarコマンドは-vオプションなしではエラー時以外メッセージを表示しないために何が動作しているかわからなくなることが多い。
-vオプションはtarコマンドでは必須のオプションだ。
この解説でも基本的に-vオプションを付与した形で解説する。
実際にtarコマンドを利用する上でメッセージが邪魔な場合は、使用例の-vオプションを外せばメッセージは表示しなくなる。
-wオプション(--interactiveオプション, --confirmationオプション):操作を行うかの確認メッセージを表示する
操作を行うかの確認メッセージを表示する。
確認メッセージに対してyまたはyesと入力した場合にその操作を行う。
-cオプションについては後で説明するが、ファイルa.datをアーカイブし、a.tarというアーカイブファイルを確認しながら作成するには次のコマンドだ。
$ tar -wcvf a.tar a.dat
ファイルa.datアーカイブしてa.tarのアーカイブファイルを作成していいか確認のメッセージが表示された。
ここで、y、またはyesと入力すればコマンドが実行される。
yを入力したのでコマンドが実行された。
-wオプションは圧縮対象となるファイルが大量になると煩わしく感じるので必要に応じて付与するようにしよう。
--show-defaultsオプション:tar の既定値を表示
tarコマンドの規定値を表示する。
$ tar --show-defaults
tarコマンドの規定値が表示された。
-cオプション(--createオプション):アーカイブを新規に作成
アーカイブを新規に作成するコマンドが-cオプションだ。
オプション-cはオプション-fとペアで使うことになる。
その場合、必ず、アーカイブに内包するファイルは指定しなければならない。
一番シンプルでスタンダードなアーカイブを作成するtarコマンドの書式は次のとおりだ。
$ tar -cvf アーカイブファイル名 アーカイブに内包するファイル
ファイルconfig.txtをarc.tarのファイル名でアーカイブするコマンドは次の通りだ。
$ tar -cvf arc.tar config.dat
ファイルconfig.txtをarc.tarのファイル名でアーカイブすることができた。
アーカイブに内包するファイルは、複数ファイルを半角スペースで区切ることで列挙もできる。
ファイルflag.phpとdata.datをarc.tarのファイル名でアーカイブするコマンドは次の通りだ。
$ tar -cvf arc.tar flag.php data.dat
ファイルflag.phpとdata.datがarc.tarのファイル名でアーカイブされた
アーカイブに内包するファイルは、複数ファイルをワイルドカードで指定することもできる。
ファイルなんとか.phpのファイル名ものすべてをアーカイブするコマンドは次の通りだ。
$ tar -cvf arc.tar *.php
ファイルなんとか.phpのファイル名ものすべてがファイル名arc.tarでアーカイブされた。
アーカイブに内包するファイルは、ディレクトリ全体で指定することもできる。
その場合、ディレクトリ構造もそのままアーカイブされる。
ディレクトリphpworksをファイル名arcphp.tarでアーカイブするコマンドは次の通りだ。
$ tar -cvf arcphp.tar phpworks
ディレクトリphpworks全体がファイル名arcphp.tarでアーカイブされた。
ちなみにアーカイブ元のファイルを指定せずに空のアーカイブは作成できない
$ tar -cvf arc.tar
「tar: 空のアーカイブ作成はご容赦願います」というエラーメッセージが表示される。
-cオプションで現存しているアーカイブファイルと同じでアーカイブファイル名を指定すると、アーカイブ内容が新たな設定のものに書き換わり、以前のアーカイブ内容は消えてしまうので注意しよう。
アーカイブに内包するファイルは存在しなければエラーになる。
$ tar -cvf arc.tar noname.file
「stat 不能: そのようなファイルやディレクトリはありません」と表示され、tarコマンドは実行されない。
オプション -r, オプション --append:アーカイブに新たなファイルを追加
アーカイブに新たなファイルを追加するオプションだ。
ファイルの追加は、現状のアーカイブの一番下に追加される。
書式は次のとおりだ。
$ tar -rvf アーカイブファイル名 アーカイブに内包するファイル
ファイルconfig2.txtをアーカイブファイルarc.tarへ追加するコマンドは次の通りだ。
$ tar -rvf arc.tar config2.dat
ファイルconfig2.txtがアーカイブファイルarc.tarへ追加された。
後で詳しく説明するが、アーカイブarc.tarの中のファイル一覧は次のコマンドで確認できる。
$ tar -tf arc.tar
追加位置がアーカイブの最後になっていることも確認できる。
-rオプションで追加されたファイルはどのディレクトリ内のファイルでもあくまでアーカイブの一番下に記録される。
記録位置が最後になるだけで、解凍時には、ディレクトリ構造はそのまま解凍されるので、解凍してもしかるべきディレクトリ位置に解凍されるので安心してほしい。
ディレクトリphpworks/php内のファイルconfig2.txtをアーカイブファイルarcphp.tarへ追加するコマンドは次の通りだ。
$ tar -rvf arcphp.tar phpworks/php/config2.dat
ディレクトリphpworks/php内のファイルconfig2.txtがアーカイブファイルarcphp.tarへ追加された。
アーカイブarcphp.tarの中のファイル一覧を確認してみよう。
$ tar -tf arcphp.tar
やはり追加位置がアーカイブの最後になっていることも確認できる。
再度、同じ名前のファイルを追加した場合はどうなるだろうか。
実は、上書きされるのではなく、この場合もアーカイブの最後に追加されるのだ。
つまり、同じファイル名が二重にアーカイブされるのである。
同じディレクトリ、同じファイル名でアーカイブされた場合は、解凍時には、最後にアーカイブされたものに上書きされる。
再度、ファイルconfig2.txtをアーカイブファイルarc.tarへ追加してみよう。
$ tar -rvf arcphp.tar phpworks/php/config2.dat
アーカイブarcphp.tarの中のファイル一覧を確認してみよう。
$ tar -tf arcphp.tar
アーカイブの最後に追加でファイルphpworks/php/config2.datが入っている。
その上にもファイルconfig2.datが入っていることがわかるだろう。
解凍・展開を行った際には、一度上のconfig2.datが解凍されるが、その後に入っているconfig2.datに置き換わる。
-uオプション(オプション --update):新しいファイルのみがアーカイブされる
同ディレクトリの同名のファイルを追加した際に、アーカイブ内のファイルよりも新しいファイルのみがアーカイブされる。
つまり、複数ファイルをアーカイブの対象とした場合、変更のあったファイルのみをアーカイブの対象とする。
追加アーカイブの-rオプションとは同時指定できない。
-rオプション同様、アーカイブの末尾に追加記録され、同ディレクトリの同名ファイルが削除されるわけではない。
される。
書式は次のとおりだ。
$ tar -uvf アーカイブファイル名 アーカイブに内包するファイル
まず、ファイルconfig2.txtをtouchコマンド等でファイル内容を変更した。
この変更したファイルconfig2.txtをアーカイブファイルarc.tarへ追加してみよう。
コマンドは次の通りだ。
$ tar -uvf arc.tar config2.dat
変更したファイルconfig2.txtがアーカイブファイルarc.tarへ追加された。
ファイルconfig2.txtを変更しないまま、同コマンドを実行してみよう。
$ tar -uvf arc.tar config2.dat
今度は変更していないのでconfig2.txtはアーカイブされない。
-Aオプション,(--catenateオプション, --concatenateオプション):tarアーカイブされたファイルの内容を追加する
tarコマンドでアーカイブしたファイルを、さらにtarコマンドでアーカイブすると、アーカイブファイルのままとしてアーカイブされる。
-Aオプションを使うことによってtarアーカイブする前のファイルとしてアーカイブに追加される。
アーカイブを結合する場合に便利なオプションだ
書式は次のとおりだ。
$ tar -Avf アーカイブファイル名 アーカイブに内包するアーカイブ済みファイル
アーカイブしたファイルarcphp.tarの内容をアーカイブファイルarc.tarへ追加するコマンドは次の通りだ。
$ tar -Avf arc.tar arcphp.tar
アーカイブしたファイルarcphp.tarの内容がアーカイブファイルarc.tarへ追加された。
アーカイブarc.tarの中のファイル一覧を確認してみよう。
$ tar -tf arc.tar
今までのarc.tarの内容の下にarcphp.tarの内容が挿入されている。
--deleteオプション:アーカイブファイル内からファイルを削除する
アーカイブファイル内からファイルを削除するオプションだ。
-vオプションは指定しても構わないが、指定してもメッセージを表示しない。
書式は次のとおりだ。
$ tar --delete -f アーカイブファイル名削除ファイル名
アーカイブファイルarcphp.tarからディレクトリphpworks/php内のファイルconfig2.txtを削除するコマンドは次の通りだ。
$ tar --delete -f arcphp.tar phpworks/php/config2.txt
アーカイブしたファイルarcphp.tarの内容からphpworks/php内のファイルconfig2.txtが削除された。
存在しないファイル名を削除するような指定をすると「アーカイブ内に見つかりません」というエラーメッセージが表示される。
現在、phpworks/php内のファイルconfig2.txtは削除されており存在しないので、再度先ほどのコマンドを実行してみよう。
$ tar --delete -f arcphp.tar phpworks/php/config2.txt
phpworks/php内のファイルconfig2.txtは削除されて存在しないために、エラーメッセージが表示された。
エラーメッセージが表示されたときは、入力したファイル名のスペルやディレクトリをチェックしてみよう。
--suffix=STRINGオプション:バックアップのアーカイブファイルの作成
現在あるアーカイブファイルと同じ名前でアーカイブファイルを作成すると上書きされてしまう。
--suffixオプションを付与することで、上書き前のファイルをファイル名にSTRINGで指定した文字を付与してバックアップすることができる。
ただし、拡張子のある、なしに関わらずSTRINGはファイル名の最後に入るので注意が必要だ。
書式は次のとおりだ。
$ tar --suffix=STRING -cvf アーカイブファイル名アーカイブ元ファイル名
現在、アーカイブファイルarcphp.tarがあって、ディレクトリphpworks内のファイルを同名のアーカイブファイルとして保存、従来のアーカイブは日付入りでバックアップするコマンドは次の通りだ。
$ tar --suffix=20160901 -cvf arcphp.tar phpworks
メッセージにある通り、従来のarcphp.tarはarc.php20160901というファイル名でバックアップされarcphp.tarが上書き作成された。
--remove-filesオプション:アーカイブに追加した元ファイルを削除する
アーカイブしてもアーカイブ元となったファイルは残っている。
そのファイルは当分の間使用しないので書庫とする場合は、ファイルが残っている意味はないだろう。
--remove-filesオプションは、アーカイブ後に元ファイルを削除するオプションだ。
削除していいかどうかは、コマンド入力前に必ず確認しよう。
書式は次のとおりだ。
$ tar --remove-files -cvf アーカイブファイル名アーカイブ元ファイル名
ファイルoldnews.txtをアーカイブファイルoldnews01.tarとしてアーカイブし、oldnews.txtを削除するコマンドは次の通りだ。
$ tar --remove-files -cvf oldnews01.tar oldnews.txt
上記コマンド実行後にlsコマンドでoldnews.txtとoldnews01.tarを見た。
ファイルoldnews.txtがアーカイブファイルoldnews01.tarとしてアーカイブされ、oldnews.txtが削除されている。
-Vオプション(--label=TEXTオプション):アーカイブにボリューム名を設定する
アーカイブにボリューム名を設定する。
ボリューム名を設定すれば、何のアーカイブかを認識でき、コメントとして設定することが多い。
書式は次のとおりだ。
$ tar -cvf アーカイブファイル名 -V ボリューム名 アーカイブ元ファイル名
ファイルdata.datをアーカイブファイルarc.tarとしてアーカイブし、news2010のボリュームを追加するコマンドは次の通りだ。
$ tar -V news2010 -cvf arc.tar data.dat
ファイルdata.datがアーカイブファイルarc.tarとしてアーカイブされ、news2010のボリュームが追加された。
--Cオプション(--directory=DIRオプション):アーカイブ元のファイルのディレクトリを指定する
アーカイブ元ファイルのディレクトリの場所を指定できるオプションだ。
通常、ディレクトリphpworks内のtest.txtを指定する場合、phpworks/test.txtと表記し、アーカイブもディレクトリphpworks内のtest.txtと記録される。
-Cオプションを使うことによって元ファイルのディレクトリのベース位置を指定できるので、アーカイブ内容もディレクトリphpworks内のtest.txtと記録されずに、ディレクトリが直下のtest.txtとしてアーカイブされる。
書式は次のとおりだ。
$ tar -cvf アーカイブファイル名 -C アーカイブ元ディレクトリ アーカイブ元ファイル名
ディレクトリphpworks内のtest.txtを、phpworks/test.txtとしてではなく、直下ディレクトリのtest.txtとしてarc.tarというファイル名でアーカイブするには次のコマンドだ。
$ tar -cvf arc.tar -C phpworks test.txt
phpworks/test.txtとしてではなく、直下ディレクトリのファイルtest.txtとしてarc.tarというファイル名でアーカイブされた。
--totalsオプション:アーカイブ後に書きだしたバイト数を表示
アーカイブしながら書き出したバイト数を表示するコマンドだ。
バックアップファイルの容量を管理する目安になるだろう。
書式は次のとおりだ。
$ tar --totals -cvf アーカイブファイル名アーカイブ元ファイル名
ファイルdata.datをax.tarというファイル名のアーカイブファイルとして保存、保存した容量を表示するコマンドは次の通りだ。
$ tar --totals -cvf ax.tar data.dat
ファイルdata.datをax.tarというファイル名のアーカイブファイルとして保存、保存した容量が表示された。
MiB/sはコンピュータがアーカイブ処理する速度だ。
--utcオプション:ファイルの更新時刻を表示
アーカイブ元のファイルの更新日時を表示するがUTC(世界標準時間)での表示になるので日本時間で考えるのであれば表示された時刻に9時間を足す。
書式は次のとおりだ。
$ tar --utc -cvf アーカイブファイル名アーカイブ元ファイル名
ファイルdata.datをax.tarというファイル名のアーカイブファイルとして保存、元ファイルの更新日時をUTCで表示するコマンドは次の通りだ。
$ tar --utc -cvf ax.tar data.dat
ファイルdata.datをax.tarというファイル名のアーカイブファイルとして保存、元ファイルの更新日時がUTCで表示された。
-Wオプション(--verifyオプション):アーカイブを書き出した後に検証
アーカイブした後に正常にアーカイブされているか検証し結果を表示する。
書式は次のとおりだ。
$ tar -W -cvf アーカイブファイル名アーカイブ元ファイル名
ファイルdata.datをax.tarというファイル名のアーカイブファイルを作成し、作成されたものが正常かどうかを検証するコマンドは次の通りだ。
$ tar -W -cvf ax.tar data.dat
ファイルtest.txtからax.tarというファイル名のアーカイブファイルを作成し、作成されたものが正常かどうかを検証された。
-xオプション(--extractオプション, --getオプション):アーカイブされたファイルを解凍し展開・復元を行う
解凍する場合は、解凍作業を表わす-xとファイルを指定する-fのオプションは必須だ。書式は次のとおりだ。
$ tar -x -xvf アーカイブファイル名アーカイブ元ファイル名
ax.tarというファイル名のアーカイブファイルを解凍し、アーカイブの内容を取り出すコマンドは次の通りだ。
$ tar -xvf ax.tar
ax.tarというファイル名のアーカイブファイルを解凍し、アーカイブの内容を取り出した。
--keep-newer-filesオプション:解凍した際に変更日時の新しいファイルを置き換えない
アーカイブされているファイルと同じディレクトリで同じ名前のものがあった場合、アーカイブされているファイルの更新日時が新しい場合のみ置き換える。
$ tar --keep-newer-files -xvf アーカイブファイル名
ax.tarというファイル名のアーカイブファイルを解凍し、アーカイブの内容を取り出そうとしたときにファイルの更新日時がアーカイブ解凍先のファイルの方が新しい場合にスキップするコマンドは次の通りだ。
$ tar --keep-newer-files -xvf ax.tar
アーカイブファイルax.tarのアーカイブの内容を取り出すときに、アーカイブされるファイルと同じ名前のファイルがあった。
今回は更新日時がすでにあるファイルと同じだったので操作をスキップした。
--overwriteオプション:解凍する場合に既存のファイルを置き換える
オプションを設定しなくても標準では上書き置き換えになるので、作業内容を明示させたいとき以外は指定の必要はない。
$ tar --overwrite -xvf アーカイブファイル名
ax.tarというファイル名のアーカイブファイルを解凍し、アーカイブの内容を取り出そうとしたときにファイル名がアーカイブ解凍先のファイル名と同じ場合にスキップするコマンドは次の通りだ。
$ tar --overwrite -xvf ax.tar
アーカイブファイルax.tarのアーカイブの内容を取り出しだした際に、同名のファイルがすでに存在していたので上書きした。
-Uオプション(--unlink-firstオプション):解凍する時に該当のファイルを削除する
一度、解凍先のファイルを削除してから解凍する。
いわばすっきりした形で解凍される。
しかし、一度削除してから解凍というプロセスを辿るため、万が一、コマンド実行中に停電などでシステムが停止した場合、完全な復元は行われないため、そのような時は、再度コマンドを実行しよう。
書式は次のとおりだ。
$ tar -U -xvf アーカイブファイル名
ax.tarというファイル名のアーカイブファイルを解凍する前に、該当するファイルを一旦削除するコマンドは次の通りだ。
$ tar -U -xvf ax.tar
見た目にはわからないが、一度、アーカイブax.tarの内容のファイルを削除しており、その後、アーカイブax.tarを展開している。
単独で使用するとディレクトリに内包されたディレクトリの場合、処理できずにエラーになることがある。
その場合は、次の--recursive-unlinkオプションを利用しよう。
--recursive-unlinkオプション:解凍する時に該当のディレクトリを削除にする
-Uオプションでは解凍前にファイルを削除した。
--recursive-unlinkオプションはそのディレクトリ版だ。
一度、解凍先のディレクトリをその内容を含んで削除してから解凍する。
書式は次のとおりだ。
$ tar --recursive-unlink -xvf アーカイブファイル名
ディレクトリ構造がアーカイブされているarcphp.tarというファイル名のアーカイブファイルを解凍し、アーカイブの内容を取り出す前に、アーカイブarcphp.tar内のディレクトリ構造と同じディレクトリを削除してから展開するコマンドは次の通りだ。
$ tar --recursive-unlink -xvf arcphp.tar
見た目にはわからないが、一度、アーカイブarcphp.tarの内容と同じディレクトリを削除しており、その後、アーカイブarcphp.tarを展開している。
--to-command=COMMANDオプション:アーカイブから取り出したファイルをプログラムで開く
アーカイブから取り出したファイルを別のプログラムで開く。
実際にファイルは展開せず、その内容のみを指定したプログラムに渡す。
書式は次のとおりだ。
$ tar --to-command=プログラム -xvf アーカイブファイル名
1つのテキストファイルがアーカイブされているax.tarというファイル名のアーカイブファイルを解凍し、catコマンドで表示するコマンドは次の通りだ。
$ tar --to-command=cat -xvf ax.tar
アーカイブax.tarの内容がcatコマンドで表示されている。
catコマンドのようなCUI環境のコマンドではなく、GUIのアプリケーションへデータを渡すことができる。
例えば、GUIのテキストエディタLeafpadでデータを表示する場合は、次のコマンドだ。
$ tar --to-command=leafpad -xvf ax.tar
アーカイブされているファイルのファイル形式や、受け取り側のプログラムの仕様にもよるが、仕様が合えば開くことができるので有効活用したい。
--mオプション(オプション--touch):アーカイブのファイルの更新時刻を現在時刻とする
初期設定ではアーカイブされた元ファイルは、解凍すると更新日時を含めて再現されるが、-mオプションを使うことで現在の日付とすることができる。
書式は次のとおりだ。
$ tar -m -xvf アーカイブファイル名
ax.tarというファイル名のアーカイブファイルを解凍したときの元ファイルを再現した時のタイムスタンプのみを現在日時に変更するコマンドは次の通りだ。
$ tar -m -xvf ax.tar
ax.tarというファイル名のアーカイブファイルを解凍したときの元ファイルを再現した時のタイムスタンプのみを現在日時に変更している。
上記の内容は見た目ではわかりにくいので、次のコマンドを実行すると動作を実感できるだろう。
$ touch a.txt $ # 次のコマンドでa.txtのもともとの変更日時が表示される(1) $ ls a.txt $ # 次のコマンドでa.txtをtest.tarとしてアーカイブしている $ tar -cvf test.tar a.txt $ # 次のコマンドでtest.tarを普通に解凍しa.txtが上書きされている $ tar -xvf test.tar $ # 次のコマンドでa.txtの日付が表示されている $ # アーカイブと解凍をしたものでも元の(1)の日時になっている $ ls a.txt $ # 次のコマンドでtest.tarを-mオプションで解凍しa.txtが上書きされている $ tar -m -xvf test.tar $ # 次のコマンドでa.txtの日付が表示されている $ # -mオプションで解凍したものは現在の日時になっている $ ls a.txt
--delay-directory-restoreオプション:すべての解凍が終了するまでファイルの属性を変えない
大量のファイルを解凍する場合は、解凍に時間がかかるが、tarコマンドで実行したすべての解凍が完了するまではファイルの更新日時や所有者情報を変更しない。
すべて完了した後に一度に変更する。書式は次のとおりだ。
$ tar --delay-directory-restore -xvf アーカイブファイル名
ディレクトリ構造がアーカイブされているarcphp.tarというファイル名のアーカイブファイルを解凍し、すべての解凍が完了するまでは日時を変更しないようにするコマンドは次の通りだ。
$ tar --delay-directory-restore -xvf arcphp.tar
見た目にはわからないが、すべて展開した後に更新日時を変更している。
-Oオプション(--to-stdoutオプション):アーカイブから取り出したファイルを標準出力に表示
標準出力とは、普通であればディスプレイだ。その標準出力にアーカイブを解凍した内容を表示させるオプションだ。
書式は次のとおりだ。
$ tar -O -xvf アーカイブファイル名
アーカイブファイルax.tar内のファイル内容を標準出力に表示するコマンドは次の通りだ。
$ tar -O -xvf ax.tar
アーカイブファイルax.tar内のファイル内容が表示された。
複数のファイルがアーカイブされているのであれば、ターゲットとなるファイル名を個別に指定することもできる。
ターゲットのファイル名は半角スペース区切りで複数指定できる。
$ tar -O -xvf アーカイブファイル名 ターゲットのファイル名
アーカイブファイルax2.tar内のファイル内容の中のa.dat及びc.datの内容を標準出力に表示するコマンドは次の通りだ。
$ tar -O -xvf ax2.tar a.dat c.dat
アーカイブファイルax.tar内のファイル内容の中のa.dat及びc.datの内容が標準出力に表示された。
-jオプション(--bzip2):bzip2形式で圧縮する
-jオプションを使えば、アーカイブしつつbzip2形式で容量を圧縮できる。
アーカイブの拡張子は自動では付与されないため、混乱を避ける意味で、一般的にその圧縮形式で使われている拡張子を指定する。
書式は次のとおりだ。
$ tar -j -cvf アーカイブファイル名 アーカイブ元ファイル
ディレクトリphpworks全体をbzip2形式で圧縮されたアーカイブファイルphp.bz2としてアーカイブするには次の通りだ。
$ tar -j -xvf php.bz2 phpworks
ディレクトリphpworks全体がbzip2形式で圧縮されたアーカイブファイルphp.bz2としてアーカイブされた。
-zオプション(--gzip):gzip形式で圧縮する
-zオプションを使えば、アーカイブしつつgzip形式で容量を圧縮できる。
アーカイブの拡張子は自動では付与されないため、混乱を避ける意味で、一般的にその圧縮形式で使われている拡張子を指定する。
書式は次のとおりだ。
$ tar -z -cvf アーカイブファイル名 アーカイブ元ファイル
ディレクトリphpworks全体をgzip形式で圧縮されたアーカイブファイルphp.tar.gzとしてアーカイブするには次の通りだ。
$ tar -z -cvf php.tar.gz phpworks
ディレクトリphpworks全体がgzip形式で圧縮されたアーカイブファイルphp.tar.gzとしてアーカイブされた。
ちなみに以下は、内容の同じディレクトリphpworksに対し圧縮方式を変えてアーカイブした一覧だ。
php.tarは無圧縮なのでファイル容量が極端に大きい。
次いで、gzip形式圧縮のphp.tar.gz、あまり容量が変わらないがbzip2形式のphp.bz2が最も小さい容量となった。
--gunzipオプション:圧縮されたアーカイブを解凍する
圧縮されたアーカイブを解凍するオプションだ。
しかし、--gunzipオプションがなくとも解凍できる場合もある。
指定することで圧縮方式が違う場合には対処できないこともある。
作業が圧縮ファイルの解凍作業であることを明示するために使うとよいだろう。
書式は次のとおりだ。
$ tar --gunzip -xvf アーカイブファイル名
ディレクトリphpworks全体をgzip形式で圧縮されたアーカイブファイルphp.tar.gzを解凍するには次の通りだ。
$ tar --gunzip -xvf php.tar.gz
ディレクトリphpworks全体がgzip形式で圧縮されたアーカイブファイルphp.tar.gzが解凍された。
-tオプション(--listオプション):アーカイブの内容を一覧表示
アーカイブの内容のファイル一覧を解凍せずに確認したい場合に使うオプションだ。
-fオプションで対象となるアーカイブファイル名を指定しなければならない。
書式は次のとおりだ。
$ tar -tf アーカイブファイル名
ディレクトリphpworks全体をbzip2形式で圧縮されたアーカイブファイルphp.bz2ファイルの内容を確認するには次のコマンドだ。
$ tar -tf php.bz2
ディレクトリphpworks全体をbzip2形式で圧縮されたアーカイブファイルphp.bz2ファイルの内容が確認された。
実際の解凍は行われていない。
-vオプションを付与するとファイルの属性も表示できる。
$ tar -tvf php.bz2
今度はファイルの所有者や変更日時の情報も表示されている。
-Mオプション(--multi-volumeオプション):アーカイブを分割する
動画などのファイルは1ファイルだけで100MByteある場合もあるだろう。
一般的なメールは1つのメールで送信するのに上限の容量が決まっており、例えば上限容量が5MByteの場合は全くメールでは送信できないので、他の手段で相手に渡すことになる。
例えば、DVDやUSBメモリに保存して郵送で送るのでは届くまで時間がかかる。
最近はクラウドサーバーでやりとりすることもあるが、ほとんどのサービスではアドレスさえわかれば誰でもアクセスできるので、メールに比べればセキュリティ的に問題がある。
そこで、大きな1つのファイルをメールで送れるサイズの複数のファイルに分割し、それを1つずつ送るということができる。
分割したアーカイブをマルチボリュームのアーカイブという。
そのマルチボリュームのアーカイブを扱うオプションが-Mオプションだ。
1つのファイルサイズは--tape-lengthオプションを使いkByte単位で指定する。
ファイルサイズを「tape-length」という言葉で表現しているのには、理由がある。
昔は記録の媒体が今のようなディスクや半導体メモリではなく、磁気ディスクであったことに由来する。
今の時代としては違和感があるかも知れない。
-Mオプションの書式は次のとおりだ。
$ tar -M --tape-length=分割する1ファイルの大きさ -cvf 分割ファイル名 分割ファイル名2…
分割ファイル名は半角空白で区切る。
分割ファイルが指定した数より少ない場合は、そこで打ち切る。
ディレクトリphpworksの内容を、ファイルp1.tarからp4.tarまでの4つのファイルに1ファイル12kByteで区切り分割する場合は次のコマンドだ。
$ tar -M --tape-length=12 -cvf p1.tar -f p2.tar -f p3.tar -f p4.tar phpworks
上記コマンドを実行した後に、lsコマンドで指定のアーカイブファイルが出来ているか調べた画面だ。
ディレクトリphpworksの内容が、4つのファイルに分割されている。
アーカイブの容量がわからない時は、分割ファイル名を1つだけ指定しておき、都度、表示されるメッセージにnで反応しファイル名をその場で指定することもできる。
$ tar -M --tape-length=12 -cvf p1.tar
都度、nに続きファイル名を指定できる。
n以外やそのままEnterを入力するとファイルが上書きになるので注意が必要だ。
分割したアーカイブを結合し、復元するのも分割する時と同じ-Mオプションだ。
分割する場合は新規アーカイブファイルとして作成する-cオプションを付与するのだが、復元は解凍と同じで-xオプションを指定し、分割されたアーカイブファイルを-fオプションで一つ一つ指定する。
$ tar -M -xvf p1.tar -f p2.tar -f p3.tar -f p4.tar
またははじめの1ファイルを指定し、表示されるメッセージにすべてnで答え、都度、ファイルを指定する方法もある。
$ tar -M -xvf p1.tar
都度、nに続きファイル名を指定できる。
n以外やそのままEnterを入力するときちんとアーカイブが復元されなくなるので注意が必要だ。
--test-labelオプション:アーカイブのボリューム情報を表示する
-Vオプションによってアーカイブにボリューム名が設定されていればボリューム情報を表示する。
書式は次のとおりだ。
$ tar --test-label -vf アーカイブファイル名
アーカイブファイルoldnews01.tarのボリュームを確認するコマンドは次の通りだ。
$ tar --test-label -vf oldnews01.tar
アーカイブファイルoldnews01.tarのボリュームが表示された。
関連コマンド
最後にtarコマンドに関連して、基本的なアーカイブや圧縮のコマンドも紹介しておく
gzip
gzip形式で圧縮ファイルを作成する。
gunzip
gunzip形式で圧縮ファイルを作成する。
zcat
zip形式で圧縮されたファイルを解凍せずに内容を確認する。
bzip
gzipよりも圧縮率の高い圧縮ファイルを作成する。
bunzip2
bzipコマンドで圧縮されたファイルを解凍する。
split
ファイルを指定した行数で分割する
まとめ
tarでひとまとめにしたアーカイブは、アーカイブ前の個々のファイルとしては読み出せないが、元ファイルがテキストファイルだけであれば、実はcatコマンドで開いて内容を見ることができる。
ファイルの内容の他にディレクトリ情報やファイル名、どんなファイルかの情報がヘッダーとして記録されている。
圧縮したアーカイブファイルは、数学的な計算により、テキストファイルのように簡単には読み取れない形に変換されている。
圧縮したアーカイブを読み取るためには、圧縮形式にあわせたオプションを付与して読み取ろう。
20GByteのディスクのバックアップを行う際、バックアップの媒体として1枚4.7GBの記憶容量のDVDディスクを考えれば5枚ということになる。4GByteごとのマルチボリュームで、なおかつ何らかの圧縮を同時に行えば、必要なディスク枚数も減るだろう。
バックアップとしてtarコマンドを考えた場合、注意したいのは、アーカイブを作成する時点と、それを展開する時点で、大容量のディスク領域が必要となる。
例えば、200GByteのアーカイブを作ってDVDなどにバックアップするのであれば、無圧縮であればアーカイブファイルを一時的に作成するための200GBの空き領域が必要になるのであらかじめ準備が必要だ。
展開時にもケースによっては必要になるかも知れない。
また、GUIでの圧縮・解凍ソフトではエラーとなったものでも、tarコマンドで正常に圧縮・回答できたケースもある。バックアップされた圧縮ファイルが解凍できないことで生じる損失は計り知れない。あきらめる前にtarコマンドを試してみよう。
tarコマンドは、複数ファイルを相手に渡すときや、バージョン管理のためのバックアップ時によく使われるLinuxコマンドの中でも使用頻度の高いコマンドだ。
ぜひ、動作原理や使用方法を把握して活用してほしい。
コメント