iamlaosong文

邮件结算数据压缩包由工作人员不定时从结算系统下载再FTP到指定的目录,所以我需要一个脚本,每天定时(用crontab)检测是否有上传的压缩包,如果有,则解压、截短文件名,导入数据库。之所以要截短文件名,是因为下载的压缩包中的文件名除了含有结算日期和类型外,还包括生成时间及序列号,而这一部分我是不需要的(没有规律和意义),所以要截去,以便于导入程序处理。压缩包分两种:使用费和补偿费,每个压缩包有6个文件,分别是出口分拣、进口分拣、航空、陆运、转运和投递。下面是脚本并解释几个关键点:

#timing job:unzip & import costs datafile by iamlaosong 20170215
#!/bin/shBAKDIR=/home/oracle/ems_suan
BINDIR=/home/oracle/bin/sdpt_js
#OPDATE=`date -d '-1 day' +%Y%m%d`cd ${BAKDIR}
# OPDATE=today - seq
for i in $(seq 45 -1 7)
doOPDATE=`date -d "-$i day" +%Y%m%d` echo ${OPDATE}# process SYF zipfilezipfile=${OPDATE}*SYF*.zipif [ -f ${zipfile} ]; thenunzip ${zipfile}for tfile in ${OPDATE}*SYF*.txtdotshort=${tfile%SYF*.txt}SYF.txtif [ ${tfile} != ${tshort} ]; thenmv ${tfile} ${tshort}fidone[ ! -d ${OPDATE} ] && mkdir -p ${OPDATE}rename _NBCL _ ${OPDATE}*SYF.txtmv ${OPDATE}*SYF.txt ${OPDATE}mv ${zipfile} all_zipcd ${BINDIR}./jsimp.sh ${OPDATE} SYF >/dev/nullcd ${BAKDIR}fi# process BCF zipfilezipfile=${OPDATE}*BCF*.zipif [ -f ${zipfile} ]; thenunzip ${zipfile}for tfile in ${OPDATE}*BCF*.txtdotshort=${tfile%BCF*.txt}BCF.txtif [ ${tfile} != ${tshort} ]; thenmv ${tfile} ${tshort}fidone[ ! -d ${OPDATE} ] && mkdir -p ${OPDATE}rename _NBCL _ ${OPDATE}*BCF.txtmv ${OPDATE}*BCF.txt ${OPDATE}mv ${zipfile} all_zipcd ${BINDIR}./jsimp.sh ${OPDATE} BCF >/dev/nullcd ${BAKDIR}fi
done

1、for i in $(seq 45 -1 7)

产生一个45到7的序列,用于产生距当天多少天的日期,以便检测那个日期的压缩包是否存在。

2、tshort=${tfile%SYF*.txt}SYF.txt

产生一个短文件名,将多余的不确定部分截掉,详细见Linux中如何批量截短文件名
3、rename _NBCL _ ${OPDATE}*SYF.txt

批量修改文件名,将文件名中的部分字符改成其它字符,见linux下批量修改文件名,本例是为了去掉一些字符。

4、zipfile=${OPDATE}*SYF*.zip

这个赋值有点意思,如果文件存在,其中的通配符“*”会转换成相应的字符,如果不存在,则将“*”直接赋给变量。

5、导入程序执行较慢,如果上传的压缩包过多,就会发生头天脚本还没结束,第二天又会定时启动一个新的脚本,为避免此事的发生,脚本前面应该加一段检测代码,如果有导入进程,则退出处理,代码如下:

sdpt=$(ps -ef|grep sdpt_js)
sdpt=${sdpt#*./}
if [ ${sdpt:0:7}="sdpt_js" ]; thenecho The import program is running.exit
fi

其中${sdpt#*./}是截取“./”后面的字符串,而${sdpt:0:7}则是取前7个字符,如果是“sdpt_js”就退出处理。

6、 [ ! -d ${OPDATE} ] && mkdir -p ${OPDATE}

这是两个连续的命令,前一个是检测目录是否存在,后一个是创建目录。“&&”的意思是前一个命令如果执行成功,就执行后一个命令,本例中就是如果目录不存在(注意其中的感叹号表示“非”)就创建目录。类似的还有“||”,表示前一个命令如果执行不成功,就执行后一个命令,所以,这个代码也可以写成:

cd ${OPDATE} || mkdir -p ${OPDATE}

==============================================

实际应用过程中发现根据序列生成日期的方式检测压缩文件并处理存在一个缺陷,就是有时压缩包上传的时间太迟了,导致文件不在序列生成的日期范围,压缩文件处理不到,还需要人工处理,所以需要改进处理办法。考虑到文件名中含有日期,现在改为直接检测压缩文件,提取文件名称中的日期,然后进行处理,这样就和上传日期无关了。

脚本如下:

#timing job:unzip & import costs datafile by iamlaosong 20170623
#!/bin/shsdpt=$(ps -ef|grep sdpt_js)
sdpt=${sdpt#*./}
if [ "${sdpt:0:7}" = "sdpt_js" ]; thenecho The import program is running.exit
fi. /home/oracle/.bash_profile
BAKDIR=/home/oracle/ems_suan
BINDIR=/home/oracle/bin/sdpt_js
#OPDATE=`date -d '-1 day' +%Y%m%d`cd ${BAKDIR}
for zipfile in *.zip
doOPDATE="${zipfile:0:8}" echo ${OPDATE}# process SYF zipfileif [[ ${zipfile} =~ "SYF" ]]; thenecho  ${zipfile}
#    read -p "SYF file: press enter to continue..." varunzip ${zipfile}for tfile in ${OPDATE}*SYF*.txtdotshort=${tfile%SYF*.txt}SYF.txtif [ ${tfile} != ${tshort} ]; thenmv ${tfile} ${tshort}fidone[ ! -d ${OPDATE} ] && mkdir -p ${OPDATE}rename _NBCL _ ${OPDATE}*SYF.txt
#    read -p "SYF file: press enter to continue..." varmv ${OPDATE}*SYF.txt ${OPDATE}mv ${zipfile} all_zipcd ${BINDIR}./jsimp.sh ${OPDATE} SYF >/dev/nullcd ${BAKDIR}fi# process BCF zipfileif [[ ${zipfile} =~ "BCF" ]]; thenecho  ${zipfile}
#    read -p "BCF file: press enter to continue..." varunzip ${zipfile}for tfile in ${OPDATE}*BCF*.txtdotshort=${tfile%BCF*.txt}BCF.txtif [ ${tfile} != ${tshort} ]; thenmv ${tfile} ${tshort}fidone[ ! -d ${OPDATE} ] && mkdir -p ${OPDATE}rename _NBCL _ ${OPDATE}*BCF.txt
#    read -p "BCF file: press enter to continue..." varmv ${OPDATE}*BCF.txt ${OPDATE}mv ${zipfile} all_zipcd ${BINDIR}./jsimp.sh ${OPDATE} BCF >/dev/nullcd ${BAKDIR}fi
done

"[[ ]]" 判断命令,比单个中括号更通用,支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。
"=~"正则式匹配符号,利用它可以判断左边的字符串是否包含右边的字符串。

附:shell中单中括号与双中括号的区别

1.单括号TEST命令要对变量进行单词分离,当变量值包含空白符时,要用引号将变量括起来;而双括号的TEST命令不会对变量进行单词分离。

以下情况分为变量为单个单词,含有空格的词组。

[root@www yansan]# echo $name

hello

[root@www yansan]# [ $name = "hello" ]

[root@www yansan]# echo $?

0

[root@www yansan]# [[ $name = "hello" ]]

[root@www yansan]# echo $?

0

[root@www yansan]#

得出结论,因为变量只有一个单词嘛,单双括号的单词分离都没有影响到这个变量了。

[root@www yansan]# echo $name1

hello world

[root@www yansan]# [ $name1 = "hello world" ]

-bash: [: too many arguments

[root@www yansan]# echo $?

2

[root@www yansan]# [ "$name1" = "hello world" ]

[root@www yansan]# echo $?

0

[root@www yansan]# [[ $name1 = "hello world" ]]

[root@www yansan]# echo $?

0

[root@www yansan]#

这次变量是一个词组了,带空格那种了。当我们要测试时,结果发现BASH回应参数太多了,这是怎么回事呢?原来是单引号TEST命令对变量进行单词分离了,结果也就变成了

[ hello world = "hello world" ],多了那个字符串hello,成了字符串world和字符串hello world之间的比较了。因此如果在单括号的TEST命令中的变量含有空格,但它还得和字符串比较,那就必须给变量加个双引号了,这时它就不会发生错误了。而在下面的双括号的TEST命令中,即使变量含有空格又何妨,因为它不能对变量单词进行分离嘛。

2.单方括号的TEST命令,通常用内置的TEST命令来测试表达式的值,TEST命令也被链接到方括号上。这样,既可以使用单独的TEST命令,也可以通过把表达式用单方括号括起来,来测试表达式的值。

[root@www yansan]# ll abc

-rw-r--r-- 1 root root 0 Sep 24 08:59 abc

[root@www yansan]# test -r abc ; echo $?

0

[root@www yansan]# [ -r abc ] ; echo $?

0

[root@www yansan]#

3.单括号的TEST命令不对SHELL元字符进行扩展的,而双括号TEST命令则会对SHELL元字符进行扩展的了。

[root@www yansan]# name=tom

[root@www yansan]# [ $name = t?? ]

[root@www yansan]# echo $?

1

[root@www yansan]# [[ $name = t?? ]]

[root@www yansan]# echo $?

0

[root@www yansan]#

4.在双括号的TEST命令当中,如果一个字符串(不管含不含有空格)仅仅是在表达式中作为一个普通字符串,而不是一个模式的一部分,则它也必须用引号括起来。

我的理解是如果一个字符串值(右边那个的了)不加双引号,那这个字符串就是模式来的,如果它里面有含有SHELL元字符,BASH会对它进行扩展。如果字符串加了双引号,那它就是一个很普通的字符串的,即便字符串里面里面含有特殊字符,也就是当普通内容来处理。

[root@www yansan]# echo $name

tom

[root@www yansan]# echo $name1

tomm

[root@www yansan]# [[ $name = tom ]]

[root@www yansan]# echo $?

0

[root@www yansan]# [[ $name = tom? ]]

[root@www yansan]# echo $?

1

[root@www yansan]# [[ $name1 = tom ]]

[root@www yansan]# echo $?

1

[root@www yansan]# [[ $name1 = tom? ]]

[root@www yansan]# echo $?

0

[root@www yansan]#

[root@www yansan]# [[ $name = "tom" ]]

[root@www yansan]# echo $?

0

[root@www yansan]# [[ $name = "tom?" ]]

[root@www yansan]# echo $?

1

[root@www yansan]# [[ $name1 = "tom" ]]

[root@www yansan]# echo $?

1

[root@www yansan]# [[ $name1 = "tom?" ]]

[root@www yansan]# echo $?

1

5 [ express1 –a express2 ] 这是放在单括号的TEST命令中的,因为单的不支持元字符扩展,因此就只能叫做表达式了,它们可以组合构成逻辑测试的,不过与或非使用( -a –o !)的形式。

[root@www yansan]# ll mm

-r--r--r-- 2 root root 644 Sep 24 08:48 mm

[root@www yansan]# [ -r mm -a -x mm ]

[root@www yansan]# echo $?

1

[root@www yansan]#

[[pattern1 –a pattern1]] 这是放在双括号TEST命令中的,因为单条式子可以支持元字符嘛,所以可以叫做模式表达式了,也就可以用于复合逻辑了,不过与非或使用(&& || !)的形式了。

[root@www yansan]# echo $name
tom
[root@www yansan]# [[ $name = [tT]om && $name = t?? ]]
[root@www yansan]# echo $?
0
[root@www yansan]#

检测压缩包并处理的Linux脚本(解压、批量修改文件名、导入)分析相关推荐

  1. cmd批量修改文件名 增加文字_Windows批处理脚本:以批量修改文件名为例

    批处理脚本,英文名叫Batch,扩展名.bat取了前3个字母.语法好像其实是DOS命令,说实话我不会,当年我每次想玩<大富翁>,都是要喊我妈给我打开的.所以说Windows这样的视窗操作系 ...

  2. linux shell中怎样批量修改文件名为 文件夹_文件名

    如何将 多个目录下的文件 批量修改文件名 比如 abc目录下的test1.txt,text2.txt ... 修改为 abc_test.txt abc_test2.txt ... def目录下的tes ...

  3. linux 补充文件名,linux修改文件名(Linux 下使用 shell 批量修改文件名的三种方法)...

    1.通过sed替换 [root@node01 wolf]# find / -type f -name wolf.log /wolf.log /tmp/wolf.log /root/wolf/wolf. ...

  4. linux rar解压_linux命令

    文件搜索 打包和压缩文件 Linux下的多用户多任务操作系统 查看文件内容 挂载一个文件系统 磁盘空间 用户和群组 文件的权限 文件的特殊属性 RPM 包 YUM 软件包升级器 DEB 包 安装软件 ...

  5. linux 解压参数 zxvf,在linux下面解压用的zxpf是什么意思,它跟zxvf有啥区别

    在linux下面解压用的zxpf是什么意思,它跟zxvf有啥区别 linux 命令中tar后跟的zxvf是什么意思:.tar.gz是一个压缩包   .tar只是打包而没有压缩 z:表示 tar 包是被 ...

  6. Linux中解压zip包的命令是什么?

    Linux系统里的zip是一种创建压缩存档文件的常用方式,同时也是一种传统的文件归档文件格式,那么Linux中解压zip包的命令是什么?Linux解压zip包的命令是:unzip,该命令主要用于查看和 ...

  7. linux解压rar多层文件夹,linux rar 解压文件夹_rar文件夹

    原标题:linux rar 解压文件夹_rar文件夹 本经验主要针对linux中的解压缩进行讲解工具/原料linux电脑一台linux文件解压缩1目前 rar a jpg.rar *.jpg //ra ...

  8. linux解压z格式文件夹,使用7zip解决解压zip格式文件名乱码, 最简单的解决解压z...

    使用7zip解决解压zip格式文件名乱码, 最简单的解决解压z 由于中文文件名与英文文件名编码的差异,很容易造成在Linux系统使用unzip命令解压zip格式的压缩包时造成中文文件名乱码. 最简单的 ...

  9. Linux压缩/解压命令

    Linux中有三个压缩文件的命令,其特点是这个三个命令压缩之后原文件将会美誉.它们经常与打包tar命令一起使用. 第一:常用的三个压缩/解压命令 1.gzip gzip +文件 gzip的解压 gzi ...

  10. 在linux下面解压用的zxpf是什么意思,它跟zxvf有啥区别

    在linux下面解压用的zxpf和zxvf有啥区别 在linux下面解压用的zxpf是什么意思,它跟zxvf有啥区别 linux 命令中tar后跟的zxvf是什么意思:.tar.gz是一个压缩包 .t ...

最新文章

  1. 首届清华智班30人名单公布:贵校第一批AI本科生,状元金牌云集,与姚班“抢人”...
  2. 析构函数与构造函数的调用
  3. 被忽视的ArrayList,你知道多少
  4. Execution Order of Event Functions, unity 3d 事件函数的执行顺序
  5. .NET之生成数据库全流程
  6. grep正则表达式详解及练习
  7. Mapreduce从HBASE抽取数据,生成搜索下拉服务数据,hadoop jar 调用异常问题解决
  8. Sim_EKB_Install_2021,TIA V17等西门子资料下载
  9. mysql宠物销售系统论文,宠物店管理系统的设计与实现.doc
  10. 关于golang如何生成文档
  11. ARM裸机--看门狗定时器
  12. 关于互联网金融的安全、监管
  13. 学期末总结——我体会的翻转课堂
  14. 基于虹软人脸识别技术,实现新生实时身份认证和报到统计
  15. 5)自适应滤波(二)[RLS算法]
  16. 赛福天拟增资LG供应商,切入动力电池领域;清能股份氢燃料电池渣土车项目落地佛山 | 能动...
  17. ASO服务包括哪些内容?
  18. 【TED笔记】如何掌控你的自由时间
  19. Ogre 天龙八部 GridInfo文件格式说明(正确版)
  20. Calendar的用法

热门文章

  1. laravel5.5通过yansongda/pay组件实现支付宝电脑网站支付
  2. 搭建高性能日志服务器,rsyslog日志服务器搭建
  3. 【黄啊码】软件测试之Loadrunner教程
  4. javalinux服务器上写文件,java 读取linux服务器上文件
  5. 批处理for循环命令详解
  6. Traceroute/tracert原理和实践
  7. 深度linux系统老版本,Deepin Linux15.7下载
  8. 工资计算系统设计实现
  9. 没有你不会的CAD?CAD知识整理上集
  10. 百亿节点,毫秒级延迟,携程金融基于nebula的大规模图应用实践