shell实现大批量word转码然后分析相关字段
需求
需要从服务器中的所有附件(2013-2019) 共60G查找相关字段
在linux上面直接打开doc等是乱码的
思路
先全部附件转码为txt, 然后用grep遍历查找字段实现
转码shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #!/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这个文件夹中.
注:我这是双开
工具
1 | yum install libreoffice unoconv -y |
注:也可以自己下载包安装, 我偷个懒是直接yum拉取的
检索shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #************************************************************************* # > 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秒之内能转好), 如果卡住了, 干掉当前的进行下一个.