Chinaunix

标题: 性命忧关!!!!拜托各位高手!!!急!!!!! [打印本页]

作者: 雨梦—新生    时间: 2004-11-03 13:03
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
假定在指定目录及其下级子目录下有一批数据文件,这些文件的文件名中均包含格式为“yyyymmdd”格式的日期信息,请写出一个KSH/BASH脚本clean.sh,当执行:
   clean.sh <dir> <xxxxyyzz>
   时,该脚本能自动到<dir>目录及其下级目录下搜索出所有文件名中的日期信息在所指定的日期<xxxxyyzz>之前的文件,并予以删除



  
作者: bitbull    时间: 2004-11-03 13:53
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
当文件名为yyyymmdd时的做法,可以进入任意层子目录删文件
如果文件名非yyyymmdd格式,请自行修改
望高手求精!!

  1. typeset -i NAME TIME
  2. TIME=$2
  3. DEL () {
  4. for NAME in $(ls $1|sed 's/\t/ /g')
  5.         do
  6.         if [ -f "$NAME" ]
  7.                 then if [ "$NAME" -lt "$TIME" ]
  8.                         then echo y|rm $NAME
  9.                 fi
  10.         fi
  11.         done
  12. }
  13. CDDEL () {
  14. for D in $(ls -F|grep '/$'|sed 's/\///g')
  15.         do
  16.         cd $D
  17.         DEL
  18.         CDDEL
  19.         cd ..
  20.         done
  21. }
  22. cd $1
  23. DEL
  24. CDDEL
复制代码

作者: 雨梦—新生    时间: 2004-11-03 14:14
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
1、文件名并不规则,除了八位连续数字,可能还包括别的!!!
2、输入的日期是否符合日期规则也需判断,如20040931就不符合标准!
3、仅指定一级目录,要找到次目录及其下级目录下的所有相关文件!!
望高手们多多发表意见!!!
作者: ZealeS    时间: 2004-11-03 14:45
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
文件名字不好匹配啊。
没有什么规则吗?
作者: 雨梦—新生    时间: 2004-11-03 14:52
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
难就难在此了!
只告诉文件名中包含了格式为“yyyymmdd"的日期信息,至于文件名中还有什么,那就不定了!!
而且如果日期输入的不对也要判断出来!!
有挑战性吧!!!
还有就是,找出来的文件并不一定在同一级目录下呀!!!!     
作者: 雨梦—新生    时间: 2004-11-03 14:54
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
任务内容就是上面的完全版,大家努力一下吧!!!
作者: begincwcw    时间: 2004-11-03 15:02
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
你自己为什么不努力???
作者: begincwcw    时间: 2004-11-03 15:03
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
你自己为什么不努力???
作者: xchen301    时间: 2004-11-03 15:16
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
不复杂但是程序挺长,待会帖上来~
作者: xchen301    时间: 2004-11-03 16:49
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
晕,有个问题,你的数据不规则,如果不光有yyyymmdd,还有其他数字怎么办?比如:20020101010? ---->20020101/10  or 20/20101010
作者: zhoubasten    时间: 2004-11-03 17:12
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
数据不规则,很不好处理。如果yyyymmdd的格式规则就好办了
作者: bitbull    时间: 2004-11-03 17:49
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
原帖由 "雨梦—新生" 发表:
1、文件名并不规则,除了八位连续数字,可能还包括别的!!!
2、输入的日期是否符合日期规则也需判断,如20040931就不符合标准!
3、仅指定一级目录,要找到次目录及其下级目录下的所有相关文件!!
望高手们多?.........



我想可以用CUT截取需要的日期数字
如果数字所在的位置还是无规则,那.........小弟无语

我给的程序就可以找到任意级文件,不管你有几层
麻烦你先看下程序好吗?

再麻烦你提供一下文件名的例子好吗?
我们文件名都没看到,怎么截呀
作者: 寂寞烈火    时间: 2004-11-03 20:51
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
起个好主题吧!
作者: begincwcw    时间: 2004-11-03 21:00
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
原帖由 "雨梦—新生" 发表:
1、文件名并不规则,除了八位连续数字,可能还包括别的!!!
2、输入的日期是否符合日期规则也需判断,如20040931就不符合标准!
3、仅指定一级目录,要找到次目录及其下级目录下的所有相关文件!!
望高手们多?.........


shell不是万能的,处理这种问题应用C。不知寂寞烈火兄是否有办法,如果他有办法,你我又可以学一招。如果没有办法,你只能等死。
作者: begincwcw    时间: 2004-11-03 22:38
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
刚才花了点时间,写一个不完善的小程序,各位可以去测试一下。

说明:
1、本程序不能对所输入的年月日是否正确进行判断,希望各位完善。
2、本程序只能删除当前目录下<包括子目录>一年以内的数据,跨年的数据不能删除。
3、文件名中年月日不作限制,aa20041101bb.txt 、a200408.txt等都可以。
4、本程序执行后,不删除文件,只显示在屏幕上。如:
rm  ./bb/abc20040503b.txt
rm ./a20040915abgcd.txt

在unix5.0.5通过:

echo ""|
nawk 'BEGIN {
                while (1)
                {
                        printf("\n\n\t请输入日期:";
                        getline  date <"/dev/tty"
                        if( length(date) != "8" || date ~/[a-z]|[A-Z]/)
                                print "输入长度不是8位或包函非数字字符!!!"
                        else
                                break
                }
        }
        {
                while (" find \.\/ -name \\*[0-9][0-9][0-9][0-9]\\* -print"|getline d){
if( substr(d, match(d, substr(date, 1, 4)), 8 )!~/[a-z]|[A-Z]/ && substr(date, 1, 6) > substr(d, match(d, substr(date, 1, 4)), 6))
                printf("rm %s\n", d)
if( substr(d, match(d, substr(date, 1, 4)), 8 )!~/[a-z]|[A-Z]/ && substr(date, 1, 6) == substr(d, match(d, substr(date, 1, 4)), 6) && substr(date, 7, 2) > substr(d, match(d, substr(date, 1, 4)) + 6, 2))
                printf("rm %s\n", d)
                 }
}'

好了,去睡觉了,明天见。
作者: 雨梦—新生    时间: 2004-11-04 09:55
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
我并不是没有努力。我刚刚接触这个东西,由于工作需要,要学习,可是老板上来就给了这么一个难题,我。。。。。。。!!!我现在已经把对时间的判断程序写了出来,可是下面的,我现在实在没办法,大家一起努力吧,只不过我想,高手们应该比我强多了!!!
作者: 雨梦—新生    时间: 2004-11-04 10:09
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
我在努力,只不过我刚开始学,由于工作需要,老板又一下就给了这么一个难题(对我来说),我。。。。。。。!!!!
我把判断日期的程序写出来了!
其实我觉得找文件不难,可以用find 命令,可是找出来后的截取、判断就比较难办一些,问题是不知道找出来的文件是在第几级下面,是不规则的,而且文件名中只是“包含”日期名,可能还有其它的一些东西,怎么把日期取出来进行比对呢?
作者: 雨梦—新生    时间: 2004-11-04 10:39
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
我一直在努力,我是刚刚开始学习,由于工作需要,老板一下子又给了这样一个题目,我。。。。。。!难哪(对我来说),所以在此请各位高手帮忙一下!!
关于对时间的判断的程序我已基本搞定。
找文件吗,也不难,用find命令就可以实现,问题是,找到文件后对它的处理是最麻烦的!首先,不知道她是在第几级目录下,其次就是不知道她的名称的组成是什么样的,如何截取出我们想要的日期信息是最难的,在之后的比较及删除也就简单多了!!!
作者: ZealeS    时间: 2004-11-04 11:02
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
能找到需要的文件就简单了,就是难找阿。
找到了加个 | xargs rm -f {}
不就行了,管他在哪里。
作者: 梦蓝    时间: 2004-11-04 11:06
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
#!/bin/sh

process_date()
{
YEAR=`expr substr $1 1 4`
MONTH=`expr substr $1 5 2`
DAY=`expr substr $1 7 2`

CAL=`cal $MONTH $YEAR 2>/dev/null`
if [ $? -eq 0 ] && [ `echo ${CAL}|awk '{print $NF}'` -ge $DAY ];then
  echo "1"
else
  echo "0"
fi
}

find $1  -type f  2>/dev/null | while read line
do
FLAG=0

name=`basename ${line}`
list=`echo ${name}|sed 's/[^0-9]/ /g'`
  
for item in ${list}
do
   item=`echo $item|sed s/[^0-9]//g`
   while [ -n "${item}" ] && [ `expr length "${item}"` -ge 8 ] && [ $FLAG!="1" ]
   do
    subitem=`expr substr ${item} 1 8`
    FLAG=`process_date ${subitem}`   
    item=`echo ${item}|sed 's/^[0-9]//'`   
   done
done

if [ $FLAG = "1" ];then
  echo "rm $line"  
fi
done
--------------------------------------------------
用法:查找路径作为唯一参数
功能:该目录(包括各级子目录)所有文件
      可以判断日期的合法性,日期格式:yyyymmdd
        显示所有包含合法日期的文件
如:we20041324不显示  220041221456显示

测试通过linux
作者: whtlly    时间: 2004-11-04 11:16
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
  1. #!/bin/bash
  2. asdf() {
  3. echo "判断输入格式是否正确"
  4. }
  5. while :
  6. do
  7.         echo "请输入日期"
  8.         read date
  9.         if asdf $date ; then
  10.                 break
  11.         else
  12.                 echo "格式不对"
  13.         fi
  14. done
  15. echo "asdf">/tmp/test
  16. date1=$date"2359"
  17. touch -t $date1 /tmp/test
  18. find . ! -newer /tmp/test -exec ls -l {} \; 2>/etc/null
  19. rm -rf /tmp/test
复制代码

rh9通过
我没有写判断输入格式的函数,你可以加上
你先试试,执行正确的话,把ls -l 改成 rm -rf
作者: 雨梦—新生    时间: 2004-11-04 11:17
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
举例:
现找到文件:./.netscape/cache/00/cache3DE333400362298,如何能够判断此文件名中含有的日期是合法的,并是20041024之前的?
作者: whtlly    时间: 2004-11-04 11:29
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
原帖由 "whtlly" 发表:
rh9通过
我没有写判断输入格式的函数,你可以加上
你先试试,执行正确的话,把ls -l 改成 rm -rf

不好意思,没仔细看帖子,您可以将
find . ! -newer /tmp/test -exec ls -l {} \; 2>/etc/null 换成
find . -name *$date* -exec ls -l {} \; 2>/etc/null
作者: bitbull    时间: 2004-11-04 12:03
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
原帖由 "雨梦—新生" 发表:
举例:
现找到文件:./.netscape/cache/00/cache3DE333400362298,如何能够判断此文件名中含有的日期是合法的,并是20041024之前的?


小弟愚撮,未看出cache3DE333400362298有日期信息,望指点
作者: bitbull    时间: 2004-11-04 12:05
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
原帖由 "雨梦—新生" 发表:
举例:
现找到文件:./.netscape/cache/00/cache3DE333400362298,如何能够判断此文件名中含有的日期是合法的,并是20041024之前的?


小弟愚撮,未看出cache3DE333400362298有日期信息,望指点
作者: 梦蓝    时间: 2004-11-04 12:19
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
如下函数:
process_date()
{
YEAR=`expr substr $1 1 4`
MONTH=`expr substr $1 5 2`
DAY=`expr substr $1 7 2`

CAL=`cal $MONTH $YEAR 2>/dev/null`
if [ $? -eq 0 ] && [ `echo ${CAL}|awk '{print $NF}'` -ge $DAY ];then
   old=`date -d "20041024" +%s`
   new=`date -d "$YEAR$MONTH$DAY" +%s`
   if [ ${old} -ge ${new} ];then
    echo "1"
   else
    echo "0"
   fi
else
  echo "0"
fi
}
作者: 雨梦—新生    时间: 2004-11-04 12:31
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
那要有你编的程序判断,文件名有八个连续的数字,你要自己判断是否符合日期格式,符合再判断是否小于给定日期!!!
有命令或方法可以直接找到含合格日期的文件吗?
作者: 梦蓝    时间: 2004-11-04 12:41
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
没有
作者: 雨梦—新生    时间: 2004-11-04 12:48
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
梦蓝,你好!我初学,你的程序有些地方我看不太明白,能否给稍加注释!!!   
作者: 梦蓝    时间: 2004-11-04 13:05
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
#!/bin/sh

#用法:process_date $1 $2
#判断8位字符$1是否是在$2之前的日期
process_date()
{
#取年月日
YEAR=`expr substr $1 1 4`
MONTH=`expr substr $1 5 2`
DAY=`expr substr $1 7 2`

#年月是否合法
CAL=`cal $MONTH $YEAR 2>/dev/null`
#日是否合法
if [ $? -eq 0 ] && [ `echo ${CAL}|awk '{print $NF}'` -ge $DAY ];then
#换算成秒,比较先后
old=`date -d "$2" +%s`
new=`date -d "$YEAR$MONTH$DAY" +%s`

if [ ${old} -ge ${new} ];then
echo "1"
else
echo "0"
fi
else
echo "0"
fi
}

#查找目录下所有文件
#$1 目录
#$2 基准日期,格式YYYYMMDD
#显示所有一般文件
find $1  -type f  2>/dev/null | while read line
do
FLAG=0

#取文件名
name=`basename ${line}`
#取文件名中的数字
list=`echo ${name}|sed 's/[^0-9]/ /g'`

#对每一连续的数字串进行处理
for item in ${list}
do   
   item=`echo $item|sed s/[^0-9]//g`
   #判断每一个数字串中的8位字串是否为目标日期
   while [ -n "${item}" ] && [ `expr length "${item}"` -ge 8 ] && [ $FLAG != "1" ]
   do
    subitem=`expr substr ${item} 1 8`
    FLAG=`process_date ${subitem}`   
    item=`echo ${item}|sed 's/^[0-9]//'`   
   done
done

#如果该文件名中含有目标日期,则显示删除命令
if [ $FLAG = "1" ];then
  echo "rm $line"  
fi
done
作者: 雨梦—新生    时间: 2004-11-04 13:10
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
非常感谢!!
我现在用vi编辑器在编写我自己想到的小程序,可能“土”些,仅供大家浏览一下!!
可不要见笑呦!!!!
作者: zhhui2000    时间: 2004-11-04 13:11
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
建议:
先用C语言写一个程序判断一个字符串是否有合法日期,若有则输出其日期.

再用find 命令找出某一目录下的文件生成文本.

然后对此文本逐个处理生成删除脚本.
作者: 雨梦—新生    时间: 2004-11-04 14:26
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
我虽然写出了一个能够完成题目的程序,但刚被老板否定了,说不现实,太费时!
现求教大家:
1、用cut命令得到的内容,如何能判断出她是否为空?

2、如何在“sdfjsidasnweisdns”中取出连续的八个字符!!
作者: 雨梦—新生    时间: 2004-11-04 14:47
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
已经基本上算是搞定了,待我整理一下给大家看!!!   
作者: xchen301    时间: 2004-11-04 15:09
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
[quote]原帖由 "雨梦—新生"]已经基本上算是搞定了,待我整理一下给大家看!!!   [/quote 发表:


很想见识一下你怎么取日期的,
作者: 雨梦—新生    时间: 2004-11-04 15:12
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
偶也费了九牛二虎之力呦!!
希望倒时大家能把此程序给充分完善!!
作者: xchen301    时间: 2004-11-04 15:30
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
原帖由 "雨梦—新生" 发表:
偶也费了九牛二虎之力呦!!
希望倒时大家能把此程序给充分完善!!


晕,兄弟你是灌水还是咋的,倒是贴啊
作者: 雨梦—新生    时间: 2004-11-04 15:41
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!

作者: skyvoice    时间: 2004-11-04 23:29
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
用perl几句话就搞定了,问题也不算是太难,目录遍历,寻找文件,删除
作者: 大漠深处    时间: 2004-11-05 00:08
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
高,实在是高。
作者: 網中人    时间: 2004-11-05 07:12
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
OS 是啥平台?
若是都用 gnu 的 grep & date 這些 tools, 或許簡單些...
作者: 雨梦—新生    时间: 2004-11-05 10:35
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
问:
   令  num=1; dir=` echo $filename | cut -f$num -d/ `;
>  后面吗,我想判断,如果$dir符合我的要求就进行下一步,不符合的话,num=` expr $num + 1 `;继续运行   dir=` echo $filename | cut -f$num -d/ `;再判断

我现在是不知用什么能让他如此循环!!!请大家指点一下!!
作者: 梦蓝    时间: 2004-11-05 12:25
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
不知你到底要干什么?????
不再关注!
作者: 網中人    时间: 2004-11-05 12:31
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
to 樓主:

問而不答, 非禮也.
作者: 雨梦—新生    时间: 2004-11-05 14:10
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
read time; wrong=日期输入错误,执行失败; year=` expr $time \/ 10000 `; mon1=` expr $time \/ 100 `; mon2=` expr $year \* 100 `; mon=` expr $mon1 - $mon2 `; day=` expr $time - $mon1 \* 100 `; years=` expr $year \/ 4 `; yearss=` expr $years \* 4 `; if [ $year = 0 -o $mon -lt 1 -o $mon -gt 12 -o $day -lt 1 -o $day -gt 31 ]; then echo $wrong; else for i in 4 6 9 11; do if [ $mon = $i ]; then if [ $day -gt 30 ]; then echo $wrong; fi; fi; done; if [ $mon = 2 ]; then if [ $year = $yearss ]; then if [ $day -gt 29 ]; then echo $wrong; fi; else if [ $day -gt 28 ]; then echo $wrong; fi; fi; fi; fi
上面的程序是判断日期的!
find . -name "*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*" | while read filename; do num=1; while [ $filename != " " ]; do num=` expr $num + 1 `; dir=` echo $filename | cut -f$num -d/ `; if [ -z $dir ]; then break; fi; done;  num=` expr $num - 1 `; dir=` echo $filename | cut -f$num -d/ `; echo $dir; done
这个是找出文件,并只提取文件名的程序!!
后面的还在整理中!!
请大家多多指教!!!
并不是我卖关子,我实在是不熟,请多给点时间!!!   
希望大家能多给建议!!!
作者: 網中人    时间: 2004-11-05 15:02
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
我再問一次: 你用啥作業系統?
若沒回應, 或不是 linux, 那我也不再理了...
作者: 雨梦—新生    时间: 2004-11-05 15:24
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
我用的是unix,用vi编辑器!!用ksh和bash,在我也不太懂了,我自己还不太清楚呢!
作者: rollingpig    时间: 2004-11-05 16:00
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
A simple but slow way

do a loop
from the oldest date to input date


  1. function addDate
  2. {
  3. .....
  4. }
  5. while : ; do
  6. find . -name "*$date* -exec rm {} \;
  7. date=`addDate $date`
  8. done
复制代码

作者: wangrujun    时间: 2004-11-05 16:27
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
[quote]原帖由 "雨梦—新生"]我用的是unix,用vi编辑器!!用ksh和bash,在我也不太懂了,我自己还不太清楚呢![/quote 发表:


这个弟弟连自己的系统是什么都搞不清楚。
网中人老兄,您实在不必为这样的帖子花费时间。

就这个帖子的标题,要在以前早给删除了。
作者: 寂寞烈火    时间: 2004-11-05 16:45
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
原帖由 "wangrujun" 发表:


这个弟弟连自己的系统是什么都搞不清楚。
网中人老兄,您实在不必为这样的帖子花费时间。

就这个帖子的标题,要在以前早给删除了。

呵呵呵呵
作者: 雨梦—新生    时间: 2004-11-09 13:08
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
#! bin/ksh
           read path time;
           find $path -name "*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*" |
           while read filename;
                 do   num=1;
                      while [ $filename != " " ];
                            do   num=` expr $num + 1 `;
                                 dir=` echo $filename | cut -f$num -d/ `;
                                 if [ -z $dir ];
                                      then break;
                                 fi;
                       done;  
                       num=` expr $num - 1 `;
                       dir=` echo $filename | cut -f$num -d/ `;
                       date=` echo $dir | cut -c1-8 `;
                       echo $date > /tmp/dood;
                       test ` grep "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" /tmp/dood `;
                       aaa=` echo $? `;
                       num=1;
                       while [ $aaa = 1 ];
                               do    num=` expr $num + 1 `;
                                     numb=` expr $num + 7 `;
                                     date=` echo $dir | cut -c$num-$numb `;
                                     echo $date > /tmp/dood;
                                     test ` grep "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" /tmp/dood `;
                                     bbb=` echo $? `;
                                     if [ $bbb = 0 ];
                                          then break;
                                     fi;
                        done;
                        if [ $date -lt $time ];
                             then   year=` expr $date \/ 10000 `;
                                    mon1=` expr $date \/ 100 `;
                                    mon2=` expr $year \* 100 `;
                                    mon=` expr $mon1 - $mon2 `;
                                    day=` expr $date - $mon1 \* 100 `;
                                    years=` expr $year \/ 4 `;
                                    yearss=` expr $years \* 4 `;
                                    if [ $year -gt 0 -a $mon -lt 13 -a $mon -gt 0 -a $day -lt 32 -a $day -gt 0 ];
                                         then   for i in 4 6 9 11;
                                                    do    if [ $mon = $i ];
                                                               then   if [ $day -lt 31 ];
                                                                           then  rm $filename;
                                                                      fi;
                                                          fi;
                                                 done;
                                                 for i in 1 3 5 7 8 10 12;
                                                     do   if [ $mon = $i ];
                                                               then   if [ $day -lt 32 ];
                                                                           then   rm $filename;
                                                                      fi;
                                                          fi;
                                                 done;
                                         else   if [ $mon = 2 ];
                                                     then  if [ $year = $yearss ];
                                                                then   if [ $day -lt 30 ];
                                                                            then   rm $filename;
                                                                       fi;
                                                                else   if [ $day -lt 29 ];
                                                                            then   rm $filename;
                                                                       fi;
                                                           fi;
                                                fi;
                                    fi;
                          fi;
            

经试验,是成功的!!不知大家能否看懂,比较不正规吧!!!!

希望大家能够给与改进!!!

不要怨我,我真的还没搞清楚呢!!不过,肯定是shell!
作者: bitbull    时间: 2004-11-09 13:23
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
哪里是判断类似
444322004102332fda.kkk
这种文件名的?这也算合法吧,按前面你的要求应该也要判断出这种文件名吧?
小弟没找到这部分判断,望指教
作者: 雨梦—新生    时间: 2004-11-09 18:14
标题: 性命忧关!!!!拜托各位高手!!!急!!!!!
#!/bin/bash

isdigit() {
  if [ $1 '<' '0' -o $1 '>' '9' ]; then return 1; else return 0; fi
}

lastdayofmonth() {
  year=$1
  mon=$2
  if [ $mon -eq 1 -o $mon -eq 3 -o $mon -eq 5 -o $mon -eq 7 -o $mon -eq 8 -o $mon -eq 10 -o $mon -eq 12 ]; then
    echo 31
  elif [ $mon -ne 2 ]; then
    echo 30
  elif [ $((year%400)) -eq 0 ]; then
    echo 29
  elif [ $((year%4)) -ne 0 ]; then
    echo 28
  elif [ $((year%100)) -ne 0 ]; then
    echo 29
  else
    echo 28
  fi
}

validate() {
  day=$1
  year=`echo $day|cut -c1-4`
  mon=`echo $day|cut -c5-6`
  day=`echo $day|cut -c7-8`
  if [ $year -lt 1900 -o $year -gt 3000 ]; then return 1; fi
  if [ $mon -lt 1 -o $mon -gt 12 ]; then return 1; fi
  if [ $day -lt 1 -o $day -gt `lastdayofmonth $year $mon` ]; then return 1; fi
  return 0
}

getfilename() {
  fullname=$1
  while true; do
    subdir=`echo $fullname|cut -f2- -s -d'/'`
    if [ -z "$subdir" ]; then break; fi
    fullname=$subdir
  done
  echo $fullname
}

getdate() {
  basename=`getfilename $1`
  pos=1
  counter=0
  while true; do
    ch=`echo $basename|cut -c$pos`
    pos=$((pos+1))
    if [ -z "$ch" ]; then break; fi
    isdigit $ch
    if [ $? -ne 0 ]; then
       counter=0
       continue;
    fi
    counter=$((counter+1))
    if [ $counter -lt 8 ]; then continue; fi
    fileday=`echo $basename|cut -c$((pos-)-$((pos-1))`
    validate $fileday
    if [ $? -eq 0 ]; then
      echo $fileday
      return 0
    fi
  done
}

checkdate() {
  filename=$1
  lastday=$2
  day=`getdate $filename`
  printf "=%s." "$day"
  if [ -z "$day" ]; then
    return 1
  elif [ "$day" -lt "$lastday" ]; then
    return 0
  else
    return 1
  fi
}

checkandremove() {
  filename=$1
  lastday=$2
  printf "\ncheckandremove %s %s..." $filename $time
#  if [ ! -f "$filename" ]; then
#    return 1
#  fi
  checkdate $filename $lastday
  if [ $? -eq 0 ]; then
    echo "\nremove $filename..."
    rm $filename
    return 0
  else
    return 1
  fi
}

if [ -z "$1" ]; then
echo "Input path:"
read path
else
path=$1
fi

if [ -z "$2" ]; then
echo "Input date:"
read time
else
time=$2
fi

validate $time
if [ $? -ne 0 ]; then
  echo "Error Date Format : $time"
  exit 1
fi

#find $path > /tmp/1
#echo "find complete"
while read filename; do
checkandremove $filename $time
done < /tmp/1




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2