コマンドを用いてファイル名のエンコーディングがCP932(WindowsのShift_JIS)なZIP書庫を作成
UTF-8なロケールのGNU/Linux上でそのままファイル名のエンコーディングがUTF-8の日本語ファイル名を含むZIP書庫を作成し、WindowsやWineの環境で開こうとすると、正しくファイル名が扱えずに化けてしまう。
「Wine上のfoobar2000で日本語ファイル名のオーディオファイルを含むZipファイルを開いたときの不具合とその対処法」で扱ったように、Wine上のWindowsアプリケーションを用いて書庫を作成すれば問題は起こらないが、同様のことを端末上でコマンドを用いて行うための方法はまだ扱っていないため、ここでまとめておく。
ファイル名エンコーディングの変換ツールconvmvについて
ファイル名のエンコーディングを変換するツールとしてconvmvというもの(Perlスクリプト)があり、書庫の作成時にGNU/Linux側でCP932(WindowsのShift_JIS)エンコーディングのファイル名に名前変更してしまうことにより、Windows上で正常にファイル名が処理されるようにする。
これはディストリの必須パッケージではないため、「command not found」になってしまうことがあるが、同名のパッケージとしてインストールできる場合がほとんど。
Gentoo/Debian/Ubuntu/Fedora/Mandrivaには存在することを確認した。
実際の流れ
作業用ディレクトリの作成
まず、後でzipコマンドで圧縮するときに直接CP932なファイル名を引数に指定するのは難しいので、圧縮のためのディレクトリを作成しておく。このディレクトリは日本語や全角英数などの多バイト文字を含まないようにし、ここではtopという名前にする。
$ mkdir top
中身を用意
次に、ZIPファイルに入れたいファイルやディレクトリをその中に入れる。
(コピーしてくる場合) $ cp -a [.zipファイルに入れるファイルやディレクトリ...] top/ (移動してくる場合) $ mv [.zipファイルに入れるファイルやディレクトリ...] top/
ファイル名のエンコーディングをCP932に変換
ここでtopディレクトリ以下のファイル/ディレクトリのファイル名エンコーディングをCP932に変換する。-rオプションと--notestオプションの組み合わせが必要。
$ convmv -f utf8 -t cp932 -r --notest top/
ZIPファイルの作成
この状態でzipコマンドを用いてディレクトリtop以下をZIPファイルにまとめる。
下の作業例ではout.zipという名前のZIPファイルを作成しているので、必要に応じて実際の出力ファイル名に読み替える。
(ZIPファイルの最上位ディレクトリがtopの下の階層になるようにする場合) $ cd top/ $ zip -9 -r ../out.zip * $ cd - (ZIPファイルの最上位ディレクトリがtopになるようにする場合) $ zip -9 -r out.zip top/