[Linux] 批量转换整个目录下的文件编码为UTF-8;
[Linux] 批量转换整个目录下的文件编码为UTF-8;
#!/bin/bash - #===============================================================================# # FILE: conv.sh# # USAGE: ./conv.sh # # DESCRIPTION: 一个支持把整个目录递归转换GB2312为UTF-8的脚本; # # OPTIONS: ---# REQUIREMENTS: Linux内核的操作系统; # BUGS: 目前不支持传入参数中含有空格; # NOTES: 输入支持三种格式,随你的心意而定制; # AUTHOR: linkscue (scue), [email protected] # 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 1fi#-------------------------------------------------------------------------------# 传入参数情形1 # 传入的是第一个参数是后缀名; # 判断的依据是第一个参数传来的不是一个文件; #-------------------------------------------------------------------------------if [[ ! -f $1 ]] ; then suffix=$1fitarget=${@: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 fidone#-------------------------------------------------------------------------------# 传入参数情形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 fifi#-------------------------------------------------------------------------------# 传入参数情形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 donefi
操作说明:
假如把这个脚本内容保存至~/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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。