2015/05/11

LHA書庫(.lzh/.lhaファイル)をLinuxで扱う

本記事はGNU/LinuxでLHA書庫を扱う上での情報をまとめたものとなる。

元の記事は2013年8月に書かれ、lhasaについてを主に扱っていたが、本記事では他のツールなどに関する内容も書き加えている。

  1. コマンドとライブラリ
    1. 各パッケージの概要とDebian/Ubuntuのパッケージ名
      1. LHa for UNIX
      2. lhasa
      3. jLHA
    2. コマンドの使い方
      1. コマンドによる書庫展開の方法
      2. 実装ごとのヘルプ
      3. コマンドによる書庫の展開時に名前が文字化けする場合の対処
  2. GUIツール
    1. Wine上の7-Zip File Managerなど
    2. Linuxで使えるGUIツール

コマンドとライブラリ

各パッケージの概要とDebian/Ubuntuのパッケージ名

各プログラムはLHA書庫以外にLArc書庫(.lzsファイル)の展開にも対応しているが、書庫ファイルを入手したことがないため動作は未確認。

LHa for UNIX

  • 公式サイトは http://lha.osdn.jp/
  • GNU/Linuxなどで使えるツールであるlhaコマンドを提供するパッケージ
  • 実装言語はC言語
  • 書庫の展開と作成がともに可能
  • LHA書庫を扱うライブラリは提供されない
  • Windowsで作成された、日本語や全角英数の文字を含む書庫(ファイルやディレクトリの名前のエンコーディングがCP932の書庫)をUTF-8環境で展開する場合、バージョン1.14iまでは文字化けが発生する[1]
  • 再配布/転載/改変については一定の条件の下で認めているが、その制約が大きく、過去にDebian/Ubuntuにも収録されていた時期[2]があったが、分類は “non-free” (自由ではないソフトウェアやデータ)となっていた
  • 2006年に公開されたバージョンが最新のリリース版で、その後開発版が2008年(r899)まで更新された後は動きがない

下はライセンスの記述。

[引用]ファイル名:man/lha.man
以下の条件で、再配布、転載、改変を許可します。 1. 著作権表示を削除しないこと。 2. 配布内容については、 a. 配布の際に存在する内容(すなわちソースコード、ドキュメント、プログラマーへの手引きなど)が再配布されたものの中に必ず存在すること。改変されているならば、それを明示したドキュメントを用意すること。 b. LHa に対する付加価値が付けられて再配布される場合にはそれらもできるだけ含めるよう努力すること。また、その際には付加価値が付けられていることを明示したドキュメントを用意すること。 c. バイナリのみの配布は許されない。(付加価値のものも含む) 3. 最新版の配布に務めること。(義務はない) 注. なお、ネットでの配付は自由であるが、ネットにアクセスできない方(雑誌および、CD-ROM などによる)配付は、配付前にこちらに E-Mail をお願いします。配付前に出来ない際には、後日必ず E-Mail をお願いします。 4. このプログラムの存在や使用したことによって生じた損害は全く保証しない。 5. 作者は、このプログラムに不備があっても、それを訂正する義務を負わない。 6. このプログラムの一部、または全部を他のプログラムに組み込んで利用してもかまわない。この場合、そのプログラムは LHa ではなく、LHa と名乗ってはいけない。 7. 商利用に関しては、上記の条件に加え、下記の条件のもとにこれを認める。 a. このプログラムをメインとする商利用は禁止する。 b. 商利用の相手がこのプログラムの使用者として不適切と判断した場合には配布しない。 c. インストールの手段として使用する場合、このプログラムを使うことを相手に強制しない。この場合、商利用者が作業を行う。また、そのときの損害は、商利用者が全責任を負う。 d. 商利用を付加価値として行いこのプログラムを使用する場合、商利用者は、そのサポートを行う。

lhasa

Windows向けの同名の書庫展開ソフトウェアとは無関係。

  • 公式サイトは http://fragglet.github.io/lhasa/
  • 実装言語はC言語
  • コマンド名(lha)や書式・オプションなどは見出し:LHa for UNIXと基本的に互換で、これと同等の機能と動作を目指して作られているが、バージョン0.3.0時点では書庫の展開のみ可能で作成はできない
  • LHA書庫を扱うライブラリ(liblhasa)が提供されており、LHA書庫を扱う機能を外部プログラムから利用できる
  • ライセンスが緩めで、ISCライセンスが採用されている
  • 2015年時点で開発が続いている
  • Debian/Ubuntuでは以下のパッケージ名
    • コマンド: lhasa
    • ライブラリの開発パッケージ: liblhasa-dev
    • lhasaコマンドとしてインストールされ、他実装がインストールされている環境でlhaコマンドとして使うにはupdate-alternativesコマンドやGUIツールのG Alternativeslhasaコマンドを指し示すように切り替える
[引用]公式サイトの記述
Lhasa aims to be compatible with as many types of lzh/lzs archives as possible. It also aims to generate the same output as the (non-free) Unix LHA tool, so that it will act as a drop-in free replacement.

jLHA

  • 公式サイトは
  • 実装言語はJavaでOS非依存
  • フロントエンド(jLHA front-end)の書式・オプションなどは見出し:LHa for UNIXと基本的に互換で、書庫の作成も可能
  • Windowsで作成された、日本語や全角英数の文字を含む書庫をUTF-8環境で展開しても文字化けしない
  • ライセンスは独自だが条件は緩めで、 “Cryptix General License” というGPL互換ライセンスに近いとされる[3]
  • Debian/Ubuntuでは以下のパッケージ名
    • コマンド: jlha-utils
    • ライブラリ: libjlha-java
    • jlhaコマンド[4]としてインストールされ、前述の切り替えの仕組みによりlhaコマンドとして使うこともできる

コマンドの使い方

コマンドの使い方(引数やオプションの指定)は基本的に実装によらず共通だが、実装やバージョンによっては利用できない操作もある。

コマンドによる書庫展開の方法

ここでは書庫の展開の操作についてのみ扱う。[5]

lhaコマンド以外の形で実行する場合は以下のコマンド名部分を置き換える。

引数として指定するLHA書庫はWindows向けの自己展開書庫[6]でもよい。

(書庫の内容を現在の作業ディレクトリ以下にディレクトリ付きで展開)
$ lha x [LHA書庫の場所]

(書庫の内容を現在の作業ディレクトリ以下にディレクトリ付きで展開・処理時のメッセージ表示なし)
$ lha xq [LHA書庫の場所]

(書庫の内容を現在の作業ディレクトリ以下にディレクトリ無しで展開)
$ lha xi [LHA書庫の場所]

(2番目のディレクトリ階層にある全ての.txtファイルを現在の作業ディレクトリ以下にディレクトリ無しで展開)
$ lha xi [LHA書庫の場所] "*/*.txt"

(書庫の内容をディレクトリ付きで指定ディレクトリ以下に展開)
$ lha xw=[展開先] [LHA書庫の場所]

(書庫の内容をディレクトリ無しで指定ディレクトリ内に展開)
$ lha xiw=[展開先] [LHA書庫の場所]

実装ごとのヘルプ

コマンド一覧とオプション一覧は横に並んで表示されるが、モバイル上で見やすいように縦に並べている。

(LHa for UNIX 1.14i)
usage: lha [-]{axelvudmcp[q[num]][vnfodizg012]}[w=<dir>] archive_file [file...]
commands:
 a   Add(or replace) to archive
 x,e EXtract from archive
 l,v List / Verbose List
 u   Update newer files to archive
 d   Delete from archive
 m   Move to archive (means 'ad')
 c   re-Construct new archive
 p   Print to STDOUT from archive
 t   Test file CRC in archive
options:
 q{num} quiet (num:quiet mode)
 v  verbose
 n  not execute
 f  force (over write at extract)
 t  FILES are TEXT file
 o[567] compression method (a/u)
 w=<dir> specify extract directory (a/u/m/x/e)
 d  delete FILES after (a/u/c)
 i  ignore directory path (x/e)
 z  files not compress (a/u)
 g  Generic format (for compatibility)
    or not convert case when extracting
 0/1/2 header level (a/u)
 e  TEXT code convert from/to EUC
 y  filename multibyte convert

(LHa for UNIX r899)
usage: lha [-]<commands>[<options>] [-<options> ...] archive_file [file...]
  commands:  [axelvudmcpt]
  options:   [q[012]vnfto[567]dizg012e[w=<dir>|x=<pattern>]]
  long options: --system-kanji-code={euc,sjis,utf8,cap}
                --archive-kanji-code={euc,sjis,utf8,cap}
                --extract-broken-archive
                --convert-filename-case
                --ignore-mac-files
                --timestamp-archive
                --traditional
                --help
                --version
commands:
 a   Add(or replace) to archive
 x,e EXtract from archive
 l,v List / Verbose List
 u   Update newer files to archive
 d   Delete from archive
 m   Move to archive (means 'ad')
 c   re-Construct new archive
 p   Print to STDOUT from archive
 t   Test file CRC in archive
options:
 q{num} quiet (num:quiet mode)
 v  verbose
 n  not execute
 f  force (over write at extract)
 t  FILES are TEXT file
 o[567] compression method (a/u/c)
 d  delete FILES after (a/u/c)
 i  ignore directory path (x/e)
 z  files not compress (a/u/c)
 g  Generic format (for compatibility)
 0/1/2 header level (a/u/c)
 e  TEXT code convert from/to EUC
 w=<dir> specify extract directory (x/e)
 x=<pattern>  eXclude files (a/u/c)

(jLHA front-end 0.1.6)
usage: lha [-]{axelvudmcpt[q[num]][vnfodizg012]}[w=<dir>] archive_file [file...]
commands:
 a   Add to archive
 x,e Extract from archive
 l,v List / Verbose list
 u   Update newer files to archive
 d   Delete from archive
 m   Move to archive
 c   Create new archive
 p   Print to STDOUT from archive
 t   Test archive
options:
 q{num} quiet mode
 v  verbose
 n  not execute
 f  force
 t  FILES are TEXT files
 o[567] compression method (a/u)
 w=<dir> specify working directory
 d  delete files after (a/u/c)
 i  ignore directory path (x/e)
 z  files not compress (a/u)
 0/1/2  header level (a/u)
 e  TEXT code convert from/to EUC-JP
 y  filename multibyte convert

(lhasa 0.3.0)
usage: lha [-]{lvtxe[q{num}][finv]}[w=<dir>] archive_file [file...]
commands:
 l,v List / Verbose List
 t   Test file CRC in archive
 x,e Extract from archive
 p   Print to stdout from archive
options:
 f  Force overwrite (no prompt)
 i  Ignore directory path
 n  Perform dry run
 q{num}  Quiet mode
 v  Verbose
 w=<dir> Specify extract directory

コマンドによる書庫の展開時に名前が文字化けする場合の対処

ファイルやディレクトリの名前のエンコーディングがCP932の書庫をコマンドで展開すると、出力されるファイルやディレクトリが文字化けすることがある。これは以下のいずれかによって対処できる。

  • jLHA front-endを使用する
  • lhasaもしくはLHa for UNIXの古いバージョンではcomvmvコマンドを用いて展開後のファイル名のエンコーディングを変換する
  • LHa for UNIXの新しいバージョンを使用し、--system-kanji-code=utf8オプションを付ける

下はcomvmvによるファイル名変換の作業例。

(現在の作業ディレクトリ以下の文字化けした名前を修正)
$ convmv -f cp932 -t utf8 -r --nosmart --notest .
  • 既定では名前変更処理は行われず、変換のために実行されるコマンド行の一覧が表示されるだけなので、実際に名前を変更したい場合は--notestオプションを付ける必要がある
  • 既定では書庫内のファイル/ディレクトリ名は自動的にUTF-8エンコーディングかどうかが判断され、変換対象になるかが決まるが、罠1.png(CP932エンコーディングの16進表記が “E3 A9 82 50 2E 70 6E 67”)など、UTF-8エンコーディングとして問題のない名前では変換対象から外れることによって化けたままになる[7]という問題点があり、変換を強制する--nosmartオプションを付けることが望ましい
  • 名前の変換を行う対象ディレクトリは “.” の部分で指定する(上の例では現在の作業ディレクトリ以下全て)

GUIツール

Wine上の7-Zip File Managerなど

Wine7-Zip File Managerをインストールして起動すると、この中で他の種類の書庫ファイルと同様にLHA書庫を展開することができる。

その他Windows向けの書庫ツールや、unlha32.dllとその対応ソフトウェアを用いるなど、色々な方法がある。

Linuxで使えるGUIツール

File Roller(Archive Manager)やXarchiverなど、GNU/Linuxで使える書庫マネージャからLHA書庫を開いて内容の一覧を確認したり展開したりできるが、基本的に前述のコマンドを内部で呼び出すものとなる。[8]

ただし、Windows上で作成された、日本語や全角英数の文字を含む書庫を開くと、項目が文字化けすることがある。

Debian/Ubuntuでは

  • jLHA front-end (パッケージ名 “jlha-utils”) がインストールされている
  • 他の実装(lhasaなど)がインストールされていないか、lhaコマンド(のシンボリックリンク)がjlhaを指し示すよう選択されている

の条件を満たしていればXarchiverでは文字化けは起こらず、File Rollerでは一覧内で文字化けすることがあるが、実際に展開すると文字化けはしない。

下の画像はXarchiver

XarchiverでCP932エンコーディングの日本語を含むファイルを開いているところ

使用したバージョン:
  • LHa for UNIX 1.14i, r899
  • lhasa 0.3.0
  • LHA Library for Java 0.06-05 (20050504)
  • jLHA front-end 0.1.6
  • Nautilus 3.14.2
  • File Roller 3.14.2
  • Xarchiver 0.5.4
  • convmv 1.15
[1]: 新しいバージョンではオプション指定によって文字化けを回避できる
[2]: Ubuntuでは12.10が収録されている最後のバージョンとなり、13.04からは含まれなくなった
[3]: Debian/Ubuntuの “libjlha-java” パッケージのソースパッケージ内の記述より
[4]: “java -jar /path/to/jlhafrontend(-[version]).jar” と等価
[5]: 他の有用な圧縮形式とそれらを扱うツールが十分に普及しており、今更LHA書庫を作成する必要というのはほぼないと考えられる
[6]: Nautilusで.exeファイルのあるディレクトリを表示するとレンジのアイコンで表示されるが、自己展開書庫の種類の判別は色々な書庫展開コマンドで試すことでもできる
[7]: この例では㩂P.pngとなる
[8]: 将来的にliblhasaが使われる可能性はある