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 もご覧ください。