• shell实现大批量word转码然后分析相关字段


    需求

    需要从服务器中的所有附件(2013-2019) 共60G查找相关字段

    在linux上面直接打开doc等是乱码的

    思路

    先全部附件转码为txt, 然后用grep遍历查找字段实现

    转码shell

    #!/bin/bash
    #*************************************************************************
    #         > File Name: doc.sh
    #         > Author: chenglee
    #         > Main : chengkenlee@sina.com
    #         > Blog : http://www.cnblogs.com/chenglee/
    #         > Created Time : 2019年04月10日 星期三 15时16分41秒
    #*************************************************************************
    Year="2018"
    format="txt"
    savedir=$(cd `dirname $0`; pwd)
    filetxt="filetxt"
    
    ls -l ${Year}/ |awk '/^d/ {print $NF}' > ${Year}.logs
    
    function Find(){
        for element in `ls $1`
        do
            dir_or_file=$1"/"$element
            if [ -d $dir_or_file ]
            then
                Find $dir_or_file
            else
                echo $dir_or_file
            fi
        done
    }
    function Filter(){
        cat filelogs | grep doc | grep -v 'pdf|zip|rar|pptv' > filedir
    }
    function Unoconv(){
        exec 2<"filedir"
        while read line2<&2
        do
            unoconv -f ${format} ${line2}
            echo "[${line2}] 已转码..."
            #mv *.txt ${filetxt}/${Year}
        done
    }
    function Move(){
        exec 4<"${Year}.logs"
        while read line4<&4
        do
            mv ${Year}/${line4}/*.txt ${savedir}/${filetxt}/${Year}/
        done
    }
    function Filetxt(){
        if [ -d "${filetxt}/${Year}" ];then
            root_dir="${Year}"
            Find $root_dir > filelogs
            Filter
            sum=`cat filedir | wc -l`
            echo "总数为:${sum}"
            Unoconv
        else
            mkdir -p ${filetxt}/${Year}
            root_dir="${Year}"
            Find $root_dir > filelogs
            Filter
            sum=`cat filedir | wc -l`
            echo "总数为:${sum}"
            Unoconv
        fi
    }
    function main(){
        Filetxt
        echo "全部文件已实现转码为txt类型"
        Move
        echo "已转码的文件已转移到${savedir}/${filetxt}/${Year}/下"
    }
    main
    

    注:先遍历附件中列出日期扔进filelogs这个文件和新建相对文件夹, 然后把所有能转码的doc和docx文件全部扔进filedir文件, 然后脚本直接识别这个文件中的目录文件, 转码方式是libreoffice+unoconv, 全部转码完成会自动把已转好的txt文件转移到filetxt这个文件夹中.

    注:我这是双开

    工具

    yum install libreoffice unoconv -y
    

    注:也可以自己下载包安装, 我偷个懒是直接yum拉取的

     检索shell

    #!/bin/bash
    #*************************************************************************
    #         > File Name: crawler.sh
    #         > Author: chenglee
    #         > Main : chengkenlee@sina.com
    #         > Blog : http://www.cnblogs.com/chenglee/
    #         > Created Time : 2019年04月10日 星期三 10时52分31秒
    #*************************************************************************
    
    filetxt="TXT"
    
    function If(){
        exec 6<"NameFile"
        while read line6<&6
        do
            grep -rn "${line6}" ${filetxt}/ > logs/result-${line6}.logs
            echo "检索${line6}完毕..."
        done
    }
    function main(){
        If
    }
    main
    

    注:全部转好之后,新建一个文件, 名称为NameFile, 里面换行写入需要查找的字段, 然后脚本会自动去读每行字符作为变量, 然后把所有结果扔进logs这个文件夹.

    维护shell

    #*************************************************************************
    #         > File Name: unockill.sh
    #         > Author: chenglee
    #         > Main : chengkenlee@sina.com
    #         > Blog : http://www.cnblogs.com/chenglee/
    #         > Created Time : 2019年04月10日 星期三 22时20分45秒
    #*************************************************************************
    #!/bin/bash
    
    function killAll(){
        echo "等待10秒开始判断"
        sleep 10;
        StringName=`ps aux | grep unoconv | grep -v grep | awk -F '/' '{print$NF}' | awk -F '.' '{print$1}'`
        if [ "$stringname" != "$StringName" ];then
            echo "[转码正常]"
        else
            echo "[卡住了]... 准备干掉当前进程"
            ps aux | grep unoconv | grep -v grep | awk -F ' ' '{print$2}' | xargs kill -9
        fi
    }
    function main(){
        while [ "1" = "1" ]
        do
            stringname=`ps aux | grep unoconv | grep -v grep | awk -F '/' '{print$NF}' | awk -F '.' '{print$1}'`
            killAll
        done
    }
    main

    注:这个是配合转码shell一起使用的, 每10秒检测一下进程(时间可以根据自己调, 一个一般5秒之内能转好), 如果卡住了, 干掉当前的进行下一个.

  • 相关阅读:
    html 中 url、scr、href、rel、rev
    MIME 和文件扩展名
    视频文件的容器格式和编码格式
    原型与原型链
    属性特征
    可选参数
    函数的定义(函数是值)
    闭包
    实现异步加载js文件及加载完成后回调
    前端工程打开速度优化的循序渐进总结
  • 原文地址:https://www.cnblogs.com/chenglee/p/10689725.html
Copyright © 2020-2023  润新知