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

  • 相关阅读:
    C语言 sprintf 函数 C语言零基础入门教程
    C语言 printf 函数 C语言零基础入门教程
    C语言 文件读写 fgets 函数 C语言零基础入门教程
    C语言 文件读写 fputs 函数 C语言零基础入门教程
    C语言 fprintf 函数 C语言零基础入门教程
    C语言 文件读写 fgetc 函数 C语言零基础入门教程
    C语言 文件读写 fputc 函数 C语言零基础入门教程
    C语言 strlen 函数 C语言零基础入门教程
    Brad Abrams关于Naming Conventions的演讲中涉及到的生词集解
    适配器模式
  • 原文地址:https://www.cnblogs.com/benmm/p/4190254.html
Copyright © 2011-2022 走看看