[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 [email protected] ; do
        if [[ -d "$n" ]]; then
            HAS_DIR=true
        fi
    done
    # 当传入参数中没有目录时,直接把传入文件转码;    if [[ $HAS_DIR != "true" ]]; then
        for n in [email protected] ; 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 [email protected] ; 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
    [email protected]
    # 提示用户输入文件的后缀名;
    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
时间: 2024-08-02 02:46:09

[Linux] 批量转换整个目录下的文件编码为UTF-8;的相关文章

#批量清理某目录下的文件或移除某目录下的文件

#!/bin/bash  #批量清理某目录下的文件或移除某目录下的文件 basedir=/data/db/renewal/snapshots   #执行目录 clear_before_days=95       #清理的时间,100代表100天前的数据 logdir=/data/log/clear      #日志路径 log=$logdir/clear.log      #日志文件 file_key="snapshot"       #清理文件包含关键字 is_font=1     

Linux查找和替换目录下所有文件中字符串(转载)

转自:http://rubyer.me/blog/1613/ 单个文件中查找替换很简单,就不说了.文件夹下所有文件中字符串的查找替换就要记忆了,最近部署几十台linux服务器,记录下总结. 查找文件夹下包含字符串的文件 例:查找/usr/local目录下所有包含”rubyer.me”的文件. grep -lr 'rubyer.me' /usr/local/* vim替换单个文件中所有字符串方法 例:替换当前文件中所有old为new :%s/old/new/g #%表示替换说有行,g表示替换一行中

批量解压目录下的文件

#!/bin/bash cd lamp ls *.tar.bz2 > ls.list for TAR in `cat ls.list` do tar -jxf $TAR done

网页版批量提取目录下特定文件类型

功能: 这是一个网页版的文件批量提取特定目录下的某种类型的文件的功能. 初始化页面文本框中值为空,当输入完成确认后,文本框中数据不会发生变化,撤销也不会发生变化,点击清空按钮则全部清空. 主要思路: 1.文本框中的值用(String)session.getAttribute()来填充,第一次打开界面,用if语句来判断,显示空,跳转过来的就显示第一次输入的值. 2.ReceiveStartServlet.java,RevokeServlet.java,ClearServlet.java都跳转到起始

在linux 系统中利用 facl 实现目录下创建文件继承父目录的权限的所属组

在linux 系统中,可以通过setfacl 来实现目录下创建文件或子目录,并继承父目录的权限. 下面以 root 用普通用户 user1 .在目录/mnt下 [[email protected] mnt]# setfacl -m u:user1:rwx share        //为目录添加ower = user1 ,并赋予rwx 的权根. [[email protected] mnt]# setfacl -d -m  u:user1:rwx share    //为目录添加默认的acl权限

Linux编译多个不同目录下的文件以及静态库、动态库的使用

先看两篇博文,作为基础知识.如果对C/C++编译链接过程都了解的话,可以跳过不看. http://www.firedragonpzy.com.cn/index.php/archives/2556 http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html 一.  编译不同目录下的多个文件 各个文件的布局如下: head.h文件的代码: [cpp] view plaincopy #ifndef  HEAD_H #define  HEAD

Linux和Windows的遍历目录下所有文件的方法对比

首先两者读取所有文件的方法都是采用迭代的方式,首先用函数A的返回值判断目录下是否有文件,然后返回值合法则在循环中用函数B直到函数B的返回值不合法为止.最后用函数C释放资源. 1.打开目录 #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); 先看Linux的,返回的是DIR*,因此出错时返回NULL(0).而这里不用关心DIR结构具体定义,只需要知道是对它进行操作(注意:DIR不是保存文

Lua 遍历Linux目录下的文件夹

代码如下,里面有注释,应该能看懂. function getFile(file_name) local f = assert(io.open(file_name, 'r')) local string = f:read("*all") f:close() return string end function writeFile(file_name,string) local f = assert(io.open(file_name, 'w')) f:write(string) f:cl

linux ls列出目录下所有文件数量

查看统计当前目录下文件的个数,包括子目录里的. ls -lR| grep "^-" | wc -l[喝小酒的网摘]http://blog.hehehehehe.cn/a/12311.htm Linux下查看某个目录下的文件.或文件夹个数用到3个命令:ls列目录.用grep过虑.再用wc统计.举例说明:1.查看统计当前目录下文件的个数 ls -l | grep "^-" | wc -l 2.查看统计当前目录下文件的个数,包括子目录里的. ls -lR| grep &q