2.6.5 ディレクトリのアーカイブ

tarのファイル名引数にディレクトリ名を指定すると、ディレクトリをアーカイブできます。その中のファイルは作業ディレクトリからの相対名で格納され、展開時にはディレクトリが内容とともに再作成されます。

ディレクトリをアーカイブするには、まずその親ディレクトリへ移動します。ここまでの手順に従っていれば、次のように入力してください。

$ cd ..
$

これで、practiceを含むディレクトリ、つまりホームディレクトリへ移動します。親ディレクトリに移動したら、サブディレクトリpracticeをファイル名引数として指定できます。practiceを新しいアーカイブファイルmusic.tarに格納するには、次のように入力します。

$ tar --create --verbose --file=music.tar practice

tarは次のように出力するはずです。

practice/
practice/blues
practice/folk
practice/jazz
practice/collection.tar

作成したアーカイブは、サブディレクトリpracticeの中ではなく、tarを実行した現在の作業ディレクトリに置かれることに注意してください。親ディレクトリからアーカイブする前に、tarでアーカイブしたいディレクトリだけでなく、親ディレクトリ自体への書き込み権限もあることを確認してください。たとえば、ルートディレクトリからtarを実行してホームディレクトリをアーカイブしようとしても、おそらく格納できません。絶対ファイル名を参照してください。(元のアーカイブファイルcollection.tarも、それ自体がアーカイブに格納されていることに注意してください。tarは内容を問わず、どのファイルでもアーカイブ対象として受け付けます。music.tarを展開すると、アーカイブファイルcollection.tarもファイルシステムに書き戻されます。)

tarに、次のようなコマンドを指定すると、

$ tar --create --file=foo.tar .

tarは「tar: ./foo.tar is the archive; not dumped」と報告します。これは、tarが何かを格納する前に、現在のディレクトリにアーカイブfoo.tarを作成するためです。その後、tarがディレクトリ.内の全ファイルを追加しようとすると、ファイル./foo.tarがアーカイブfoo.tar自体であると気付き、これを除外します(アーカイブを自分自身の中に格納しても意味がありません)。この場合、GNU tarは処理を続け、その1ファイルを除外して通常どおりアーカイブを作成します。(注意: 他のtar実装は、ここまで賢くないかもしれません。この状況で無限ループに陥るものもあるため、GNU tarを使っていると確信できないかぎり、この動作に頼らないでください。一般には、常に格納対象のディレクトリの外にアーカイブを置くのが賢明です。)