免费注册 查看新帖 |

Chinaunix

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

文件遍历循环的Bug [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-21 13:59 |只看该作者 |倒序浏览
最近遇到以下的问题。
有个文件夹存储程序生成的文件,量大,每次有3000左右个文件,Shell程序根据文件名称遍历循环,如果是空文件的话,就把次文件重命名(File_bak),之后move到另外一个文件夹(fail),如果是正常文件,则重定向新增一段文字备注至文件最下面,然后Move至备份目录。按理说,(fail)文件夹下面的文件都应该是空文件才对,可居然都不是,而是含有备注文字的(File_bak)文件。不知问题在那儿,求高手诊断,以下为代码:

for FILE in `ls -l| grep "^-"|awk '{print $9}'| grep '^M'`  #--这段判断取出符合的文件
do
    count=`cat $FILE | sed 's/ //g' | grep -v '^$' |wc -l`     #--判断是否为空文件
            
    if [ $count -ne 0 ];then                                                  #--正常文件

            cat $CONTENT >> $FILE                                  #--增加备注文字

            cat $FILE Attachment.txt |  mailx -s "[Mail title]" email-addr

                RTC=$?
            echo "RTC="$RTC
                    if [ $RTC -ne 0 ]; then
                        #Move the file to Fail Directory
                            mv $FILE $DATAFAIL/$FILE'_'$BACKUP_DATE  2>/dev/null
                            echo ".........File[$FILE] put[send] error."
                            continue
                    else           #--发送失败,则转移至fail
                            #Move the file to backup Directory
                            mv $FILE $DATABACKUP/$FILE'_'$BACKUP_DATE 2>/dev/null
                    fi
    else         #--空文件,则移至fail目录                                                
                mv $FILE $DATAFAIL/$FILE'_'$BACKUP_DATE'_bak' 2>/dev/null
                echo "File[$FILE] put[send] error."
    fi
done


以上标红内容,虽然都移至同一目录,却是不同内容的。
不知有没有更为合理的循环遍历方式,求指点。

[ 本帖最后由 rockytom 于 2007-12-21 14:57 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-12-21 14:11 |只看该作者
....
cat $CONTENT >> $FILE                                  #--增加备注文字

....
mv $FILE $DATAFAIL/$FILE'_'$BACKUP_DATE  2>/dev/null


是加了备注的就是空文件,然后被脚本移走了呀.

论坛徽章:
0
3 [报告]
发表于 2007-12-21 14:35 |只看该作者
分析你的脚本后,感觉有可能在发送邮件失败的时候,会把添加了注释的文件移动到fail目录下

而且,根据你的处理方式,如果文件中有除了空格的其他空白符(比如 TAB 符),那么就不会是空文件。

我感觉,如何判断是否是空文件(似乎你的那些文件中可能有些文件中只有空白符),用grep比较好

  1. find -maxdepth 1 -type f -name "M*" | while read file
  2. do
  3.    grep -q '[^[:blank:]]' "$file"
  4.    if [ $? -eq 0 ];then
  5.        不为空的文件
  6.    else
  7.        为空的文件
  8.    fi
  9. done
复制代码

[ 本帖最后由 springwind426 于 2007-12-21 14:39 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-12-21 14:56 |只看该作者
是这样子的,我再描述下,Mail发送失败 + 空文件都会被移至(fail)目录,只不过移过去之后文件名称变了。
1,如果空文件移过去,则变成Filename+bak后缀,内容仍然应该是空文件。
2,如果发送失败移过去,则文件名没有+bak,内容增加了备注。

现在怪就怪在Filename+bak的文件有备注内容,而这部分是在else里面处理的,照理说不会。。。

谢谢springwind426,我正测试您的grep -q '[^[:blank:]]' "$file" 用法。

论坛徽章:
0
5 [报告]
发表于 2007-12-21 17:31 |只看该作者
大家都没兴趣嘛?
waker帮我看看不。。。
有没有可能程序在进行大批量文件OI的时候,自己产生的异常呢?我是在没看出来逻辑有什么不对。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP