解决zip解压包中文文件名乱码的脚本

sh/bash/dash/ksh/zsh等Shell脚本
回复
trailbreaker
帖子: 5
注册时间: 2010-12-20 21:22
送出感谢: 0
接收感谢: 0

解决zip解压包中文文件名乱码的脚本

#1

帖子 trailbreaker » 2010-12-30 16:24

最近因为碰到了从windows上传过来的zip压缩包,解压缩后中文文件名出现乱码问题。
google了一通后把几个指令合在一起,一步解决子目录嵌套下文件名编码转换
不过因为刚学perl,这段代码基本上是抄抄改改,将就着能用,还有些不致命错误不知道怎么去解决,希望高手能帮忙 :em03

代码: 全选

#!/usr/bin/perl -w
#unzip.pl 
#用于解决windows下用zip压缩的文件到linux下时因编码问题而造成的文件名乱码
#gb2312(cp936) 转至 UTF8
#需要外部命令 7z 与 convmv (安装包p7zip-full,convmv)
#
use strict;
use warnings;

if ( $#ARGV < 0 ){
   print "Usage: unzip.pl zipfilename\n";
   exit -1;
}else{
@fn = split /\./,$ARGV[0],2;
if(-e $ARGV[0]){
	`LANG=C 7z x -o@fn[0] $ARGV[0]`;
	chdir @fn[0];
	`convmv --notest -f cp936 -t utf8 *`;
	my @tree=<*>;
	foreach (@tree){
		&if_a_tree($_);
	}
	sub if_a_tree{
	if(-d){
#		print "$_ is a directory\n";
		chdir $_;
		`convmv --notest -f cp936 -t utf8 *`;
		my @tree=<*>;
		foreach(@tree){
			&if_a_tree($_);
		}
		chdir "..";
	}
#	if(-f){
#		print "$_ just a file\n";
#	}
	}
}else{
print "文件不存在!!\n";
exit;
}
}
正常运行后的提示内容为
Scalar value @fn[0] better written as $fn[0] at ./3.pl line 18.
Scalar value @fn[0] better written as $fn[0] at ./3.pl line 19.
检查未输入文件名时出现的提示内容
Scalar value @fn[0] better written as $fn[0] at ./3.pl line 17.
Possible unintended interpolation of @fn in string at ./3.pl line 17.
Scalar value @fn[0] better written as $fn[0] at ./3.pl line 18.
Global symbol "@fn" requires explicit package name at ./3.pl line 15.
Global symbol "@fn" requires explicit package name at ./3.pl line 17.
Global symbol "@fn" requires explicit package name at ./3.pl line 18.
BEGIN not safe after errors--compilation aborted at ./3.pl line 20.
头像
astolia
论坛版主
帖子: 3190
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 538 次

Re: 解决zip解压包中文文件名乱码的脚本

#2

帖子 astolia » 2010-12-30 22:15

代码: 全选

find -depth -exec convmv -f gbk -t utf8 --notest {} \;
:em04

虽然不懂perl,不过Scalar value @fn[0] better written as $fn[0] at ./3.pl line 18.这句是叫你最好将@fn[0]改成$fn[0]
trailbreaker
帖子: 5
注册时间: 2010-12-20 21:22
送出感谢: 0
接收感谢: 0

Re: 解决zip解压包中文文件名乱码的脚本

#3

帖子 trailbreaker » 2010-12-31 19:35

谢谢楼上的提醒,把原来15,17,18行代码改了一下,是我数组变量用的不正确
方法1:

代码: 全选

my ($fn,$fk) = split /\./,$ARGV[0],2;
if(-e $ARGV[0]){
        `LANG=C 7z x -o$fn $ARGV[0]`;
        chdir $fn;
方法2:

代码: 全选

my @fn=("","");
@fn = split /\./,$ARGV[0],2;
if(-e $ARGV[0]){
        `LANG=C 7z x -o$fn[0] $ARGV[0]`;
        chdir $fn[0];
现在一切正常了 :em05
rediscover
帖子: 3173
注册时间: 2010-01-13 23:26
送出感谢: 0
接收感谢: 12 次

Re: 解决zip解压包中文文件名乱码的脚本

#4

帖子 rediscover » 2011-01-04 14:53

Here I am.
Ubuntu 桌面培训 - 全中文官方文档,含汉化截图,提供PDF
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: 解决zip解压包中文文件名乱码的脚本

#5

帖子 eexpress » 2011-01-04 14:58

chdir @fn[0];

当然是$fn[0]拉。。。

use strict;
了。你的@fn都没带my的。。。
● 鸣学
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: 解决zip解压包中文文件名乱码的脚本

#6

帖子 lilydjwg » 2011-01-04 16:41

http://lilydjwg.is-programmer.com/posts/16293.html Python3 版。另有没有在维护的 Python2 版在此论坛中。
回复

回到 “Shell脚本”