2010年2月7日日曜日

日本語ファイル名を持つファイルを含む zip ファイルを、utf-8 .tar.gz に変換する

 ZIPは古い圧縮形式です。ZIPではアーカイブのファイル名の文字コードは決まっておらず、世界各国でばらばらでした。日本ではZIPアーカイブに含まれるファイル名の文字コードは、ほぼ Shift_JIS(CP932)で統一されています。Windows XP に組み込まれている explorer も、日本では ZIPファイルのファイル名は Shift_JISとして扱います。

しかしながら、Linuxの unzip コマンドは、ZIPに含まれるファイル名を、ヨーロッパ系の文字コードと仮定して、勝手にUTF-8に直して展開します。そのため、多くの日本のZIPファイルはLinuxでは正しく扱うことができません。

これでは後々のトラブルを起こす原因になりかねないので、日本のzipファイルの中に入っている Shift_JISのファイル名を、すべて一括して、UTF-8のファイル名に変換して、tar.gz のアーカイブに変換することにしました。

標準の unzip を使っている限り、日本語を扱うことはできません。まずは、ファイル名の変換を抑制するための改造を行います。そのために、infozip のページ(http://sourceforge.jp/projects/sfnet_infozip/releases/)から、ソースコード "unzip60.tar.gz" をダウンロードします。


% tar xvfz unzip60.tar.gz
 % cd unzip60
 % cp unix/Makefile .


次に、fileio.c の、Ext_ASCII_TO_Native を呼び出している2箇所をコメントアウトします。そして、そのファイルをコンパイルし、インストールします。(デフォルトでは、/usr/local/bin/ にインストールされます。)

% make generic 
 % sudo make install

次に、/tmp ディレクトリに、専用のテンポラリディレクトリを作り(仮に /tmp/arc とします)、次のスクリプトを、パスに通しておきます。

#/bin/sh 
rm -rf /tmp/arc/*
dir=`dirname "$1"`
base=`basename "$1" .zip`
/usr/local/bin/unzip "$1" -d /tmp/arc/
convmv --notest -r -f sjis -t utf-8 /tmp/arc/*
tar cvfz "$dir/$base.tar.gz" --directory=/tmp/arc "."

このスクリプトを使うと、日本語ファイルの .zip ファイルを、コマンド一発で、UTF-8のファイル名を持つ .tar.gz に変換することができます。(ファイル名に空白が含まれる場合は、クォートに注意しましょう)。

0 件のコメント: