#!/usr/bin/perl use strict; use warnings; use utf8; use Archive::Tar qw/:ERROR_CODES/; use Encode::Guess qw/ascii euc-jp shiftjis 7bit-jis utf8/; use File::Basename; use File::Path; use Term::ReadKey; my $encoding = $ENV{LANG} =~ /euc-?jp/i ? 'euc-jp' : 'utf-8'; binmode STDOUT, ":encoding($encoding)"; binmode STDERR, ":encoding($encoding)"; my $file = $ARGV[0]; my $tar = new Archive::Tar; $tar->read($file) or die "Cannot read $file\n"; my $str; foreach my $f ($tar->get_files) { $str .= $f->name; } my $dec = Encode::Guess->guess($str); ref $dec or die "Cannot recognize files charset\n"; #print $dec->decode($str); ReadMode 3; foreach my $f ($tar->get_files) { my $utf8file = $dec->decode($f->name); my $outfile = Encode::encode($encoding, $utf8file); $outfile =~ s/\/\.\.+//g; my $outdir = dirname($outfile); mkpath $outdir if (!-d $outdir); if(-f $outfile) { print "$utf8file exist. overwrite?(Y/n)"; my $char = ReadKey(); if ($char eq 'n') { print "\n$utf8file skip!\n"; next; } } print "extract " . $utf8file . " ..."; $tar->extract_file($f->name, $outfile); print "done.\n"; }