Thursday, December 10, 2009

多文件多目录下txt合并脚本

图片

( 一张壁纸,看过宫崎骏动漫的人应该知道,这个是:树精《幽灵公主》里面的)

感谢老K,帮我解决了这个难题。事情的起因是以前收集了N多本电子书EXE、CHM格式的都有,但是EXE的文件在Linux平台下面是不能直接运行的,当时还不知道wine,但是即便现在使用wine,有些EXE格式书还是不能正常打开的,当初想把系统切换到Linux,于是找到了一个反编译的工具,将各种EXE、CHM文件都反编译为纯txt格式,一本书一个目录,目录名是书的名字,下面有子目录,里面按照书的章节一个个独立的txt文本,想把这些分散的章节合并为一个txt文本,然后按照书的名字给合并后txt重新命名,并且存放在一个新的文件夹下,这样阅读、管理起来会很方便。当初为了这个还折腾过几天的C语言,瞎折腾了,前一阵子和老K大哥扯到了这个,求他帮忙弄个脚本,午饭后他用了不到一袋烟的功夫就实现了,晚上运行的时候489个文件夹400多兆的数据眨眼的功夫就跑完了,相当快,有需要的可以参考下面的代码,保存为sh,放到需要执行的目录下双击即可,需要注意的是:

1 所有目录,子目录,文件名是中文没关系,但是不能有空格和那些特殊字符,比如/阿,=阿什么的。

2 书目录下可以有章节子目录,但是要么没目录,全TXT,要么都是子目录包括TXT,不能2者同时有,否则结果不正确。



#!/bin/bash


rootDir=`pwd`

bookFile=""


for bookDir in $rootDir/*

do

    if [ -d "$bookDir" ];then

        echo ">>> processing Book: $bookDir....." 

        tmpName="$(basename "$bookDir").txt"

        touch "$tmpName"

        bookFile="$rootDir/$tmpName"


        #check if there is sub-dir (chapters)

        ls "$bookDir" -l | grep "^d" &>/dev/null

        if [ $? -ne 0 ];then

            echo "INFO: No sub-directories found, processing txt files"

            find "$bookDir" -name "*.txt" | sort | xargs cat >> "$bookFile"

        else

            for chapterDir in "$bookDir"/*

            do

                if [ -d "$chapterDir" ];then

                    echo ">>> processing chapter: $chapterDir"

                    find $chapterDir -name "*.txt" | sort | xargs cat >> "$bookFile"

                fi

            done

        fi



        echo ">>> $bookDir processing finished!"

        echo ""

        echo ""

    fi

done


如果文档编码是GB需要转化为UTF8才能正常显示,否则就是乱码了,用下面的这个命令即(可来自ubuntu)它会将src目录下的所有文件内容由GBK到UTF8:


find src -type d -exec mkdir -p utf8/{} \;

find src -type f -exec iconv -f GBK -t UTF-8 {} -o utf8/{} \;

mv utf8/* src

rm -fr utf8


--
Best Regards
ouyangzi

0 comments: