試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

コマンドを用いてファイル名のエンコーディングがCP932(WindowsのShift_JIS)なZIP書庫を作成

UTF-8ロケールGNU/Linux上でそのままファイル名のエンコーディングUTF-8の日本語ファイル名を含むZIP書庫を作成し、WindowsWineの環境で開こうとすると、正しくファイル名が扱えずに化けてしまう。
Wine上のfoobar2000で日本語ファイル名のオーディオファイルを含むZipファイルを開いたときの不具合とその対処法」で扱ったように、Wine上のWindowsアプリケーションを用いて書庫を作成すれば問題は起こらないが、同様のことを端末上でコマンドを用いて行うための方法はまだ扱っていないため、ここでまとめておく。

ファイル名エンコーディングの変換ツールconvmvについて

ファイル名のエンコーディングを変換するツールとしてconvmvというもの(Perlスクリプト)があり、書庫の作成時にGNU/Linux側でCP932(WindowsShift_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/
後始末(エンコーディング逆変換と中身の始末)

もし中身を別の所からコピーしてきた場合はtopディレクトリごと消してもよいのだが、元のUTF-8エンコーディングに戻すには、topディレクトリに対して逆の変換を行う。

$ convmv -f cp932 -t utf8 -r --notest top/

この後でtopディレクトリ以下のファイルやディレクトリを元の場所に戻す。

関連記事:

参考URL:

使用したバージョン:

  • Perl 5.10.0
  • convmv 1.12