LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1477|回复: 15

判断文件名是连续不中断的?

[复制链接]
发表于 2006-9-4 17:18:41 | 显示全部楼层 |阅读模式
mysql-bin.000013
mysql-bin.000014
mysql-bin.000015
mysql-bin.000016
mysql-bin.000017
mysql-bin.000018
mysql-bin.000019
mysql-bin.000021
mysql-bin.000022
mysql-bin.000023
mysql-bin.000024
mysql-bin.000025
mysql-bin.000026

打个比方,怎么写脚本,可以判断上面的文件中,
从mysql-bin.000013到mysql-bin.000026,是完整的,
或者是:缺一个:mysql-bin.000020
发表于 2006-9-4 18:18:13 | 显示全部楼层
自己循环,如果有不存在的,那么就是中间有缺了。。
回复 支持 反对

使用道具 举报

发表于 2006-9-5 15:09:38 | 显示全部楼层
还有个简洁的算法,先计算文件的总行数,然后,提取最后一行,和第一行,求得相应数字的差,看是否比总行数小1,如果小1,那么就完整,否则不完整(当然,文件需要先排序)
不过本质上来说,复杂度还是O(n)的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-5 19:01:07 | 显示全部楼层
小弟不才,按Iambitious的指点写了一下:

count1=`ls mysql-bin.[0-9]* |wc -w`

min=`ls mysql-bin.[0-9]* |sort |sed -n '1p'`
max=`ls mysql-bin.[0-9]* |sort |sed -n '$p'`

#去掉前置的0
min=`echo -n ${min:10} | sed  's/^0*//'`
max=`echo -n ${max:10} | sed  's/^0*//'`

count2=$[$max-$min]

if [ $[$count2+1] -eq $count1 ]; then
  echo -e "\n ok"
else
  echo -e "\n count1=$count1 & count2=$count2"
fi
回复 支持 反对

使用道具 举报

发表于 2006-9-7 07:53:46 | 显示全部楼层
也许这个也能满足你的要求,只是打印出来的是中断之后的第一个文件名(如果有中断的话),如上面的例子,会打印出mysql-bin.000021

ls mysql-bin.[0-9]* | awk -F. '{if (last!=0 && $2-1 !=last ) print $0; last=$2}'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-7 18:13:20 | 显示全部楼层
好使,多谢楼上的
回复 支持 反对

使用道具 举报

发表于 2006-9-8 01:00:23 | 显示全部楼层
  1. ls mysql-bin.0000{13..26} 1>/dev/null
复制代码
No need to code.
回复 支持 反对

使用道具 举报

发表于 2006-9-8 01:22:38 | 显示全部楼层

  1. seq 13 26|while read i;do ls mysql-bin.0000$i &>/dev/null||echo mysql-bin.0000$i No found; done
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-9-8 01:27:40 | 显示全部楼层
Post by yongjian
  1. ls mysql-bin.0000{13..26} 1>/dev/null
复制代码
No need to code.

经典。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2006-9-8 10:43:42 | 显示全部楼层
好热闹,我也写一个
ls mysql-bin.[0-9]* |sort|awk -F. '
NR==1 {a=$2}
{if(a!=$2)
{print "not cont"
exit
}
a++
}'
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表