免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2321 | 回复: 9
打印 上一主题 下一主题

该脚本只能一次处理一文件,怎样改? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-09 12:36 |只看该作者 |倒序浏览
本帖最后由 eboy240 于 2010-12-09 12:37 编辑

以下代码是个运行正常,功能包括自动将文件按日期改名、移动、压缩、备份、写入log、发送通知邮件。

现在主要的问题在于因为是定时自动运行,一次只能处理一个ftp上传的文件,如果相同的文件名+后缀不同日期出现多个文件,比如

abc.201012091228/abc.201012101229这两个文件同时存在,则该脚本无法运行,文件一直堵塞下去。请问各位高人怎样改写才能让该脚本多

次批处理多个文件呢??谢谢指导。
  1. #!/bin/bash
  2. Logfile="/home/Log/abc.log"
  3. filedate=`date "+%Y/%m/%d-%H:%M"`
  4. tip1="Find abc File and move file to ffp server at"
  5. tip2="abc File Does Not Exist"
  6. file1="/home/abb/abc.*"
  7. localfile="/home/ftp/abb/suppabb/abc.*.txt"
  8. cformat="/home/ftp/abb/suppabb/abc.`date "+%Y%m%d"`.txt"
  9. zipfile="/home/backup/abb/abc.`date "+%Y%m%d%H%M%S"`.tgz"
  10. filename="abc"
  11. filepath="/home/ftp/NH/suppabb/"

  12. if test -e $file1
  13. then
  14.           cd /home/abb
  15.           tar -zcvPf $zipfile $file1
  16.      echo "*****Backup File to $zipfile">>$Logfile
  17.           for i in $(find -type f -iname "$filename.201*");do mv -i $i ${i%%??????}.txt;done   <<<<查找abc.201为开头的文件

  18. ,并移动,我想MV命令只能一次处理一个文件,有更好的方法吗?
  19.           mv $file1 $cformat
  20.      echo "*****$tip1 ::: $filedate">>$Logfile
  21.      echo "----------------------------------------------------">>$Logfile
  22. else
  23.      echo "$tip2 ---Check time ::::::$filedate">>$Logfile
  24.      echo "---------------------------------------">>$Logfile
  25.      echo "$tip2"|mutt -s "Tips : $tip2 ---Check time ::::::$filedate" xxx@126.com
  26. fi
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-12-09 12:56 |只看该作者
用 find exec应该怎样修改?是否可行?在哪一行修改呢?本人初学shell菜鸟,望指教

论坛徽章:
0
3 [报告]
发表于 2010-12-09 17:19 |只看该作者
将打包命名部分放到for f in (echo *)中。

论坛徽章:
0
4 [报告]
发表于 2010-12-09 17:37 |只看该作者
回复 3# 零二年的夏天


    能具体点吗?应该将哪一行加入?

论坛徽章:
0
5 [报告]
发表于 2010-12-09 22:58 |只看该作者
查找abc.201为开头的文件,并移动,我想MV命令只能一次处理一个文件,有更好的方法吗?


你的这句注释没看明白。

论坛徽章:
0
6 [报告]
发表于 2010-12-10 09:30 |只看该作者
就是MV这个命令一次只能处理一个文件的改名及移动,如果同样开头的的文件出现两个在同一个目录下则无法处理,有更好的办法吗?

论坛徽章:
0
7 [报告]
发表于 2010-12-10 10:33 |只看该作者
大致明白你的意思,对于你说的问题,可以通过
  for $name in `echo $file1`
  do
      mv XXXX XXXX
  done
来实现,但是问题是,在你的应用中,同一时刻mv多个$file1文件,最后生成的$cformat文件名是相同的(因为若干个mv基本在一秒内)。因此,关键是你的应用如何处理同一时刻生成的log文件

论坛徽章:
0
8 [报告]
发表于 2010-12-10 12:56 |只看该作者
回复 7# superxup


    好办法,那如果可以让脚本执行过程中自动以1秒为时间间隔处理文件的话,可否实现呢?不知道有没有这样的方法?

论坛徽章:
0
9 [报告]
发表于 2010-12-10 13:27 |只看该作者
回复 8# eboy240
在mv后面sleep 1就行了吧 代码: mv XXX XXX; sleep 1

论坛徽章:
0
10 [报告]
发表于 2010-12-10 16:55 |只看该作者
你的目标文件是一天一个?
源文件时是一天一个文件吗?还是一天多个文件?
是多个文件的话,你的最终目标是一个文件,这就要合并了,合并你自己搞。
感觉楼主没太说清楚需求
  1. for $name in `ls abc.201*`
  2. do
  3.     //处理每个文件
  4. done
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP