Windowsで圧縮されたZipファイルをLinuxのPerlで展開するには?

LinuxでWindowsで圧縮されたファイルを展開するには、どうすれば良いでしょう。ファイル名が文字化けしてしまって、困ったことがありませんか? 展開後のファイルについて convmv コマンドで変換する方法もありますが、ちょっとしたPerlプログラムを用意して対応してみましょう。

perlプログラムでファイル名をCP932からUTF-8へ変更しながら展開します。他のプログラミング言語でも同様なことができます。次のような unzip.pl を作成して、$HOME/binあたりへおきます。(日経Linux 2010年9月号のコードを参考にしました)

#!/usr/bin/perl
use Archive::Zip;
use Encode;

my $zip = Archive::Zip->new($ARGV[0]) or die;
my $decodeCharset=$ARGV[1]||'CP932';
my $encodeCharset=$ARGV[2]||'UTF-8';
for ($zip->members) {
  $zip->extractMember($_, encode($encodeCharset, decode($decodeCharset, $_->fileName)));
}

使い方は下記。chmod で unzip.pl に実行権を与えるのを忘れないようにすること。

$ ~/bin/unzip.pl sample.zip

デフォルト値ではCP932でエンコードされたファイルが含まれているときぐらいにしか使わないのですが、他のエンコードを使われているときのために、コマンドで指定できるようにしてあります。ZIPファイルに含まれるファイル名がEUC_JPでエンコードされているときは、下記のようにします。

$ ~/bin/unzip.pl sample.zip EUC_JP

ZIPファイルに含まれるファイル名がEUC_JPでエンコードされていて、書き出し時にCP932のファイル名で書き出したいときは、下記のようにします。

$ ~/bin/unzip.pl sample.zip EUC_JP CP932

CentOSでは、perl-Archive-Zip perl-Encode-Detect が必要です。

$ sudo yum install perl-Archive-Zip perl-Encode-Detect

なお、パスワードがついている場合は、zipcloak コマンドで対応してから、上記手順を実施すれば展開できます。

$ zipcloak -d sample.zip

Windowsで圧縮されたZipファイルをLinuxでPHPを使って展開するには? | hiro345 もご覧ください。

同じタグの記事: CentOS
同じタグの記事: Linux
同じタグの記事: Perl
同じカテゴリの記事: Linux
関連書籍: CentOS
関連書籍: Perl