最近blhy的客户提出这个需求,对方提供一批来电的流水号,让我们给出相应的录音文件。传统的情况下,客户方一般需要的是某一段时间内的录音,由于系统中的录音文件的文件名是按照年月日时分秒这个规则去命名的,所以这种情况下用命令查找和打包都比较方便。而现在是对方给我们的只是一段时间内的指定流水号。
说到这里你可能有两种思路:(1)看看这些流水号大致落在哪个时段范围内的,把这段时间内的录音文件全部打包导出,然后再从其中摘取目的文件;(2)将流水号拷贝过来,挨个从系统中去查找和下载录音文件。
个人这两种方法都有点问题,针对思路(1),如果总的录音文件少的话,还比较好处理,如果录音文件多的话,简直就是场灾难,首先你打包文件需要时间,另外你再从其中去找的话,无异于大海捞针,这里先假定录音文件名和流水号在名称上有对应关系;针对思路(2),挨个查找比较靠谱,但是如果对方给出的列表比较长的话,这就是一项重复的工作,伤神费力,也是一场灾难。
通过观察发现,blhy提供的流水号是与录音文件名没有直接的关系的,所以我的思路是:先试图通过流水号去找到录音文件名中的局部或者全部(通过excel去匹配,主要是找到对应关系),然后组装命令(editplus工具或者其他),写成shell脚本,通过执行shell脚本去查找这些录音文件并打包压缩,最后通过winSCP工具导出到本地。
于是,按照这个思路,分下面几步走:
1、在数据库的call_pickup_specimen_info表中,存储的有流水号与录音文件名局部的对应关系,流水号是specimen_code这个字段,局部的录音文件名是userfield_id这个字段,于是通过在数据库中执行查找这两列的sql语句(例如SELECT specimen_code,userfield_id FROM `call_pickup_specimen_info` where specimen_code BETWEEN ‘2014090100110054‘ and ‘2014090623595954‘),将这两列的数据查询出来,全选,复制到excel中;
2、将查找的流水号数据复制到excel的sheet2中,使用excel的VLOOKUP函数,将sheet2中的流水号对应的录音文件名局部的userfield_id信息匹配出来;
3、通过匹配得到userfield_id信息后,要考虑拼接linux命令了,完整的linux命令类似“find /var/spool/asterisk/monitor/1 -name ‘*20140825*‘ | xargs zip "/opt/blhytest.zip"。可以很明显的看出,我们需要在刚刚匹配出来的userfield_id信息的前后分别加上一段固定的内容,来拼接成我们所需要的linux命令。不喜欢黄师傅用的Notepad++,一直喜欢使用editplus这个文本编辑工具,推荐。将userfield_id复制到editplus之后,通过全选文本内容--右键“格式”--行注释--输入注释符,这里我写的是“find /var/spool/asterisk/monitor/1 -name ‘*”,也即命令的前半部分;通过“搜索”--“替换”菜单,将“\n”替换为“*‘ | xargs zip "/opt/blhytest.zip" \n”,注意勾选下面的“使用正则表达式”,即可在每行的末尾加入固定的内容,至此我们的命令已经拼接完成了,很快,至少比excel要快;
4、将该文件保存为.sh格式的文件,例如我写的是blhyexport.sh,通过winSCP工具上传到服务器上任意目录下,自己记得这个路径就行;
5、使用 "chmod 777 blhyexport.sh",为该文件授权;
6、通过"./blhyexport.sh"就可以执行该脚本打包录音文件了,屏幕闪现的是一行行的执行过程,整个打包的过程很快;
7、打包完毕,通过winSCP工具,分分钟就可以将打包的录音文件下载到本地了,这个压缩包里面的录音文件正是你想要的。
传统的依次复制流水号去查询并下载,需要浪费两三个小时甚至是一下午时间(视任务量多少而定),而使用上述方法,不论任务量有多少,不超过10分钟就可以搞定了。借助于我们熟悉的excel、editplus、linux命令,可以帮助我们快捷高效地完成任务。