需求
需要从服务器中的所有附件(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秒之内能转好), 如果卡住了, 干掉当前的进行下一个.