zoukankan      html  css  js  c++  java
  • 获取目录文件日期并比较

    -----------对目录操作----------------
    pocdata_exp_from_172.20.8.23_nscrmdb_20140907.0200

    1、根据修改时间和当前时间比较、目录名称进行筛选,再直接删除
    find . -maxdepth 1 -follow -type d ! -mtime -7 -name "pocdata_exp_from_*" | xargs rm -rf
    (1) -maxdepth 1 表示只找到第一层
    (2)-type d表示目录 -type f表示文件
    (3)除了mtime还可以使用-newer参数
    (4)删除也可使用命令-exec rm -rf

    2、先筛选目录,再用awk根据目录修改时间(时间戳)和目标时间比较,再直接删除 --循环中添加处理为自主产权
    ls -F | grep '/$'|grep pocdata_exp_from | awk '{cmd="date +%s --date="-1 day"";cmd|getline a;for(i=1;i<=NF;i++){cmd="stat -c %Y "$i"";cmd|getline b;if(b<a){print $i}}}'
    (1)删选目录ls -F | grep '/$'|grep pocdata_exp_from
    (2)时间还以用"$(date -d "7 days ago" "+%Y%m%d")"
    (3)ls|awk '{for(i=1;i<=NF;i++){print NF,$i}}'
    (4)ls|awk '{for(i=1;i<=NF;i++){cmd="stat -c %Y "$i"";cmd|getline b;print b,NF,$i}}'

    3、先筛选出目录,再筛选出符合时间的目录(根据目录名中的时间),删除
    find . -maxdepth 1 -type d -name "pocdata_exp_from_*" |sed 's/(.*)([0-9]{8})(.*)/2/'

    -----对非目录操作-----只是获取时间的字符串-------------
    -rw-r--r--. 1 aiweb_s aigrp 13408625 2014-08-06 13:30:30.913401174 +0800 catalina.out
    现在需要提取该文件的时间属性,显示为: 20140806133030

    1、
    ls -l --full-time catalina.out |sed -e 's/(.*)([0-9]{4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2})(.*)/2/' -e 's/[- :]//g'
    (1)“s//”替换,"//“中间包含了三部分,看做一个整体替换成其中第二部分
    (2)“/[- :]//g”,将三个符号全替换为空
    (3)-e 执行多个sed命令,应该可以用";"分隔,放在一个"‘ ’"中

    2、
    stat catalina.out |sed -n '6 s/[- :(Modify)]//gp'|awk -F. '{print $1}'
    (1)取stat结果的第六行,去掉其中的"-""Modidfy"" "":"符号
    (2)将上面的结果以"."分隔,取第一部分

    3、直接用awk做列的分隔
    awk 'BEGIN {FS="[-:. ]";OFS="";"ls -l --full-time catalina.out " |getline;print $13,$14,$15,$16,$17,$18}'
    (1)BEGIN{}预置了内部变量FS字段分隔符,上面句子中用的正则,OFS为反向输出分隔(上面的语句中其实就是合并分割后的各字段)
    (2)其他RS/ORS行分隔符(RS默认" ") http://blog.51yip.com/shell/1151.html
    (3)getline 通过管道或者标准输入读入,如果读取成功,getline返回1;如果读到文件结束符(EOF),getline返回0;如果发生错误,例如打不开文件,getline返回-1,所以,getline可以用于while循环中


    =================================================
    sed命令的两个作用:匹配+操作(分割替换等)
    sed '/^./([0-9]{8})$/!d; s//1/'
    (1)sed使用的正则表达式是括在斜杠线"/"之间的模式:^./([0-9]{8})$ ("./"后面连续8个0-9的数字)
    ^匹配开头,$匹配结尾
    “.” 匹配除换行符以外的单个字,这里前面加了个“”转义,就表示“.”本身
    (..)保存已匹配的字符
    []匹配指定字符组内的任一字符
    x{m} 连续m个x
    (2)!d删除其他行
    (3)s//1/'

    =================================================

    偶尔在一个shell脚本里面看到了一个类似sed 's/((.*))/11/'这样的语句,其实这个sed替换就是针对含有括号的情况

    no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)
    其中AAABBBCCCDDD都是变化的,我们要提取AAA或者BBB的情况

    首先理解一个()的情况
    举个例子:
    [root@mail root]# echo "111(222)333"| sed 's/((.*))/11/'
    111222222333

    因为((.*))只有这一个部分,所以1就意味着这一个部分提取两次(如果是2就应该提不到东西)

    [root@mail root]# echo "111(222)333"| sed 's/((.*))/12/'
    sed:-e 表达式 #1,字符 16:Invalid reference 2 on `s' command's RHS

    由于"("不是元字符,所以直接写"("(就表示"("这个符号,而"("才表示包含什么的意思

    而又因为是()里面的内容,所以将222提取两次

    如果将()去掉,例如
    [root@mail root]# echo "111(222)333"| sed 's/(.*)/11/'
    111(222)333111(222)333
    那么提取的匹配就是这个部分了

    -------------------------------------
    [root@mail root]# echo "111(222)333"| sed 's/(.*)((.*))/111/'
    111111111333
    因为//里面是由(.*) 和 ((.*))两部分组成,而1仍然是提取第一部分,也就是(222)前的所有内容和(222)这个整个部分替换为(222)前的所有内容提取三次,其后的333不变

    [root@mail root]# echo "111(222)333"| sed 's/(.*)((.*))/222/'
    222222222333
    将(222)前的所有部分和(222)看成一个整体,被替换为()内的部分,也就是222。

    此处理解222,2的含义应该是提取第二个(.*)即:“第二个包含” 得意思也就是:(将()换成yy也是一样得含义)
    [root@mail root]# echo "111y222y333"| sed 's/(.*)y(.*)y/222/'
    222222222333

    -------------------------------------
    两个括号及其以上得情况:

    [root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/(.*)((.*)).*/2/'
    DDD
    [root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/.*((.*)).*/1/'
    DDD
    以上两句意义相同。
    我们本想取到AAA,但是为什么取了DDD呢
    正则表达式是有贪婪性的,它总是与最长的可能长度匹配,而且越是排在前面的通配符优先级越高。按照这样的原则取到得就是DDD了,那么我们应该如何取得AAA呢?

    我们考虑如果在模式串中第一个".*"中告诉sed这个".*"是不能含有"("的,同时第二个".*"中不能含有""应该OK吧--[benmm]应该是第二个".*"中不能含有")"吧
    试一试:
    [root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/[^(]*(([^)]*)).*/1/'
    AAA

    以此类推,可以得到
    [root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/[^(]*(([^)]*))[^(]*(([^)]*))[^(]*(([^)]*))[^(]*(([^)
    ]*))/2/'
    BBB
    将2改为3就是CCC
    将3改为4就是DDD

  • 相关阅读:
    Mybatis3.2和Spring3.x整合----Myb…
    Mybatis3.2和Spring3.x整合----Myb…
    支持向量分类方法
    KKT了解
    机器学习实战笔记 logistic回归
    朴素贝叶斯进行分类
    决策树算法实现
    KNN算法
    Spring AOP中增强知识
    Java动态代理知识
  • 原文地址:https://www.cnblogs.com/benmm/p/4190254.html
Copyright © 2011-2022 走看看