あらゆるアーカイブを管理できるツール、atool

  atool を利用すると、さまざま方式で圧縮された、さまざまな形式のアーカイブを同じコマンドライン・インタフェースで扱うことができる。実体はPerlスクリプトのコレクションで、実際の処理はそれぞれに該当するネイティブのツールが行う。アーカイブを展開するコマンドやオプションはアーカイブの形式ごとに異なるが、atoolがそうした違いを吸収してくれるため、同じ方法でアーカイブを扱うことができるのだ。

 atoolにはaunpack、apack、als、acat、adiff、arepackというコマンドがあるが、いずれもatoolのメインPerlスクリプトにリンクしており、各コマンドが持つ機能に応じてアーカイブの展開や作成などを実行する。

 アーカイブを展開するaunpackは、ファイルが複数含まれている場合はファイルをサブディレクトリーに、1つだけの場合はカレント・ディレクトリーに置くが、-subdir(または-D)オプションが指定されていると、どちらの場合もサブディレクトリーに置く。この仕様はアーカイブを/tmpに展開するときに大いに役立つ。ファイルがサブディレクトリーに入っていないアーカイブをうっかり/tmpで展開して、ファイルをその中にばらまいてしまうおそれがないからだ。

 atoolで扱えるtarの圧縮方式には、gzip、bzip2、compress、lzop、7z、rar、lha、ace、arj、rpm、deb、jar、7zip、cpioがあり、さらに数種の圧縮方式を扱うことができる。ただし、それぞれの圧縮方式に応じたネイティブのツールがあればの話だ。一部のアーカイブ形式については内容の一覧と展開しかできないが、これはそのアーカイブを作るプログラムが入手できないためだ。たとえば、aceアーカイブの作成や変更はできない。

 それでは、いくつか使用例を見てみよう。まず、ごく簡単なファイルシステムを作り、そのtar.bz2ファイルを作成する方法を示す。もちろん、bzip2やgzipで圧縮したtarを作る方法など教わるまでもないだろう。この例を挙げたのは、これとまったく同じ構文で、どのような形式(サポートされていれば)のアーカイブでも作れることを示すためだ。

    $ cd /tmp
    $ mkdir atest
    $ cd atest
    $ mkdir testdir
    $ cd testdir
    $ date >df1.txt
    $ date >df2.txt
    $ mkdir subdir1
    $ date >subdir1/subfileb.txt
    $ cd /tmp/atest
    $ date >rawfile.txt
    $ apack testdir.tar.bz2 testdir
    testdir/
    testdir/df1.txt
    testdir/subdir1/
    testdir/subdir1/subfileb.txt
    testdir/df2.txt
    $ file testdir.tar.bz2
    testdir.tar.bz2: bzip2 compressed data, block size = 900k
    $ tar tjvf testdir.tar.bz2
    drwxrwxr-x ben/ben           0 2008-01-17 18:11 testdir/
    -rw-rw-r-- ben/ben          29 2008-01-17 18:11 testdir/df1.txt
    drwxrwxr-x ben/ben           0 2008-01-17 18:11 testdir/subdir1/
    -rw-rw-r-- ben/ben          29 2008-01-17 18:11 testdir/subdir1/subfileb.txt
    -rw-rw-r-- ben/ben          29 2008-01-17 18:11 testdir/df2.txt
    $ als testdir.tar.bz2
    drwxrwxr-x ben/ben           0 2008-01-17 18:11 testdir/
    -rw-rw-r-- ben/ben          29 2008-01-17 18:11 testdir/df1.txt
    drwxrwxr-x ben/ben           0 2008-01-17 18:11 testdir/subdir1/
    -rw-rw-r-- ben/ben          29 2008-01-17 18:11 testdir/subdir1/subfileb.txt
    -rw-rw-r-- ben/ben          29 2008-01-17 18:11 testdir/df2.txt

    $ apack testdir.cpio.7z testdir
    7-Zip (A) 4.51 beta  Copyright (c) 1999-2007 Igor Pavlov  2007-07-25
    p7zip Version 4.51 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
    Scanning

    Creating archive testdir.cpio.7z

    Compressing  testdir/df1.txt
    Compressing  testdir/df2.txt
    Compressing  testdir/subdir1/subfileb.txt

    Everything is Ok

    $ als testdir.cpio.7z

    7-Zip (A) 4.51 beta  Copyright (c) 1999-2007 Igor Pavlov  2007-07-25
    p7zip Version 4.51 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)

    Listing archive: testdir.cpio.7z

       Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2008-01-17 18:11:04 ....A           29           42  testdir/df1.txt
    2008-01-17 18:11:06 ....A           29               testdir/df2.txt
    2008-01-17 18:11:16 ....A           29               testdir/subdir1/subfileb.txt
    2008-01-17 18:11:16 D....            0            0  testdir/subdir1
    2008-01-17 18:11:11 D....            0            0  testdir
    ------------------- ----- ------------ ------------  ------------------------
                                        87           42  3 files, 2 folders