linux批量转换文件编码

#!/bin/bash - 
#===============================================================================
#
#          FILE: conv.sh
# 
#         USAGE: ./conv.sh 
# 
#   DESCRIPTION: 一个支持把整个目录递归转换GB2312为UTF-8的脚本;
# 
#       OPTIONS: ---
#  REQUIREMENTS: Linux内核的操作系统;
#          BUGS: 目前不支持传入参数中含有空格;
#         NOTES: 输入支持三种格式,随你的心意而定制;
#        AUTHOR: linkscue (scue), linkscue@gmail.com
#       CREATED: 2013年03月06日 22时52分31秒 HKT
#     COPYRIGHT: Copyright (c) 2013, linkscue
#      REVISION: 0.1
#  ORGANIZATION: ---
#===============================================================================

set -o nounset                              # Treat unset variables as an error


#-------------------------------------------------------------------------------
#  检查错误
#-------------------------------------------------------------------------------
if [[ $# == 0 ]] ; then
    echo ""
    echo "程序版本:0.1"
    echo "实现功能:批量转换GB2312字符编码至UTF-8;"
    echo "使用方法:$(basename $0) <后缀名> <文件1> <文件2> <目录1> <目录2> .."
    echo "操作提示:"
    echo "    1. 后缀名不需要'.'这个符号;"
    echo "    2. 当输入参数中无后缀名,将从传入文件中取后缀并提示是否进一步操作;"
    echo ""
    exit 1
fi

#-------------------------------------------------------------------------------
#  传入参数情形1
#  传入的是第一个参数是后缀名;
#  判断的依据是第一个参数传来的不是一个文件;
#-------------------------------------------------------------------------------
if [[ ! -f $1 ]] ; then
    suffix=$1
fi
target=${@:2:$#}
for n in ${target[@]};do
    # 判断是否是一个文件;
    if [[ -f $n ]] ; then
        iconv -f gb2312 -t UTF-8 $n -o $n 2> /dev/null
    fi
    #判断是否是一个目录
    if [[ -d $n ]] ; then
            find "$n" -name "*.$suffix" | while read line ; do
            iconv -f gb2312 -t UTF-8 "$line" -o "$line"  2> /dev/null
        done
    fi
done


#-------------------------------------------------------------------------------
#  传入参数情形2
#  传入的第一个参数是一个文件;
#  若传入参数中无目录时,将直接把文件转码;
#  若传入参数中有目录时,将询问是否以第一个参数后缀作为搜索目录条件;
#-------------------------------------------------------------------------------

if [[ -f $1 ]] ; then
    # 判断传入参数中是否有目录;
    for n in $@ ; do
        if [[ -d "$n" ]]; then
            HAS_DIR=true
        fi
    done
    # 当传入参数中没有目录时,直接把传入文件转码;
    if [[ $HAS_DIR != "true" ]]; then
        for n in $@ ; do
            iconv -f gb2312 -t UTF-8 "$n" -o "$n" 2> /dev/null
        done
    else
        # 当传入参数中含有目录时,将使用第一个传入参数的后缀;
        suffix=${1##*.}
        if [[ $suffix != "" ]]; then
            read -p ">> 发现第一个传入参数的后缀名为$suffix,是否使用它作为搜索目录的条件?[y/N]"
            if [[ $REPLY == "y" ]]; then
                for n in $@ ; do
                    if [[ -f "$n" ]]; then
                        iconv -f gb2312 -t UTF-8 "$n" -o "$n" 2> /dev/null
                    fi
                    if [[ -d "$n" ]]; then
                        find "$n" -name "*.$suffix" | while read line ; do
                        iconv -f gb2312 -t UTF-8 "$line" -o "$line"  2> /dev/null
                    done
                    fi
                done
            fi
        fi
    fi
fi


#-------------------------------------------------------------------------------
#  传入参数情形3
#  传入第一个参数是目录;
#  这时考虑到用户可能转换整个目录,却忘记输转换文件后缀名;
#  此时将会提示用户输入后缀名;
#  可以输入多个后缀名,比如Android的程序源代码含有xml与java后缀;
#-------------------------------------------------------------------------------

if [[ -d $1 ]]; then
    argvs=$@
    # 提示用户输入文件的后缀名;
    read -p ">> 发现尚未输入要转换的文件后缀名,请输入需转码的后缀[可输入多个]:" suffix_3 
    for n in ${argvs[@]};do
        # 处理的是一般文件; 
        if [[ -f "$n" ]]; then
            iconv -f gb2312 -t UTF-8 "$n" -o "$n" 2> /dev/null
        fi
        # 处理的是一个目录;
        if [[ -d "$n" ]]; then
            for suffix in ${suffix_3[@]} ; do
                find "$n" -name "*.$suffix" | while read line ; do
                    iconv -f gb2312 -t UTF-8 "$line" -o "$line" 2> /dev/null
                done
            done
        fi
    done
fi

操作说明:

假如把这个脚本内容保存至~/bin/conv,并给予权限;

使用举例:

1. conv <后缀> <文件1> <文件2> <目录1> <目录2> <目录或文件..>

conv java aaa.java bbb.java Android源代码目录1/  Android源代码目录2/

2. conv <文件1> <文件2> <目录1> <目录2> <目录或文件..>   # 注意:将以第一个文件后缀作为目录的搜索条件

conv aaa.java bbb.java Android源代码目录1/  Android源代码目录2/

3. conv <目录1>  <目录2> <目录或文件>           # 注意:这里将会提示输入后缀名(可输入多个后缀名)

conv Android源代码目录1/  Android源代码目录2/ aaa.java bbb.java
>> 发现尚未输入要转换的文件后缀名,请输入需转码的后缀[可输入多个]:xml java

有了这个转换编码,把Windows下的工程引入到Linux上开发就轻松得多了,不再有什么字符编码读不出来的问题;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值