免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Shell 求SHELL
12345下一页
最近访问板块 发新帖
查看: 11257 | 回复: 47
打印 上一主题 下一主题

求SHELL [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-10 18:52 |只看该作者 |倒序浏览
20可用积分
大家好,想请高手帮我写个shell一下:

有一个目录roam,其下有好几个目录,比如说NOC、IOC、OBRC,NOC里面有一些文件,如NOC_20080907591.0001.del;NOC_20080907591.0002.del;NOC_20080908591.0001.del;NOC_20080909591.0001.del;IOC下有一些文件,如IOC_20080907591.0001.del;IOC_20080907591.0002.del;IOC_20080908591.0001.del;
IOC_20080909591.0001.del;其它文件夹类似。
文件命名规则为:文件夹名称_YYYYMMDD区号.YYYY.del,其中YYYY为序列号0001到9999之间。
现在我想写一个shell,功能是在运行时传入一个参数,如20080908,那么该shell就把根目录roam下的每个文件是日期部分比20080908还早的文件删除掉.
如,IOC_20080901591.0001.del,因为20080901比传入的参数20080908早,所以删除.

就这样啦,请大家发言!!!!!!!!!!

注意,每个目录下的文件数都可能非常多,数据量非常庞大.
先谢过了!!!!!!!!!!!!!!!!!!!!!!!!!!!!

最佳答案

论坛徽章:
0
2 [报告]
发表于 2008-09-10 18:52 |只看该作者
  1. find . -type f -name '*.del' | awk -F_ '{if(substr($2,1,8)<20080908)print "rm -rf "$0}' | sh
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-09-10 19:02 |只看该作者
笨办法
for file in `find . -type f -name "*.del"`
do
  tmp=$(echo "$file" | grep -Eo '[0-9]{8}')
  if [ $tmp -lt 20080908 ]
  then
    rm -rf $file
  fi
done

[ 本帖最后由 爱知 于 2008-9-10 19:22 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-09-10 19:25 |只看该作者
原帖由 aboy11 于 2008-9-10 19:16 发表
find . -type f -name '*.del' | awk -F_ '{if(substr($2,1,

这个命令应该快一些

[ 本帖最后由 爱知 于 2008-9-10 19:34 编辑 ]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2008-09-10 19:27 |只看该作者

回复 #1 huangbt_unix 的帖子

bash:
./torm.sh 20080908

torm.sh:

  1. #!/bin/bash

  2. for i in $(find -name '*del*')
  3. do
  4.   base=${i##*/}
  5.   base=${base#*_}
  6.   base=${base::8}
  7.   if [ $base -lt $1 ] ; then rm $i ; fi
  8. done
复制代码

[ 本帖最后由 blackold 于 2008-9-11 09:05 编辑 ]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
6 [报告]
发表于 2008-09-10 20:34 |只看该作者
原帖由 aboy11 于 2008-9-10 19:16 发表
find . -type f -name '*.del' | awk -F_ '{if(substr($2,1,


还可以简化:

  1. find . -type f -name '*.del' | awk -F_ '$2<20080908{print "rm -f "$0}' | sh
复制代码

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19
7 [报告]
发表于 2008-09-10 20:40 |只看该作者
原帖由 ly5066113 于 2008-9-10 20:34 发表


还可以简化:

find . -type f -name '*.del' | awk -F_ '$2




简化的不错。学习..

论坛徽章:
0
8 [报告]
发表于 2008-09-10 23:27 |只看该作者
BUFLEN=50
#缓冲区大小,实用环境可调大,2000至50000
find . -type f -name '*_????????*.????.del' -print|awk -F_ '
$NF<="'$1'"{
   if(n<'$BUFLEN'){
       str=str " " $0;n+=length($0);
   }else{
       system( "rm -f " str " " $0 );n=0;str=""
   }
}
END{if (n) system( "rm -f "str );}
'
或者
BUFLEN=50
#缓冲区大小,实用环境可调大,2000至50000
find . -type f -name '*_????????*.????.del' -print|awk -F_ '
$NF<="'$1'"{
   if(n<'$BUFLEN'){
       str=str " " $0;n+=length($0);
   }else{
       print "rm -f " str " " $0 ;n=0;str=""
   }
}
END{if (n) print "rm -f "str ;}
'|sh -x

论坛徽章:
0
9 [报告]
发表于 2008-09-10 23:33 |只看该作者
5楼的效率应该较低.
$2换成$NF是兼容你的目录名中含_的情况。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
10 [报告]
发表于 2008-09-11 09:17 |只看该作者

  1. #!/bin/sh
  2. find roam -name '*.del'|awk 'BEGIN{FS=='_'}{t=substr($2,0,8);if(t<'"$1"')print}'|xargs rm -f
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP