zoukankan      html  css  js  c++  java
  • 使用shell巧妙高效的批量删除历史文件或目录

    背景:有实时产生的数据按小时分文件保存,如“/data/2013/09/18/14.txt”。现需要保留30天的最新数据,而删除所有其它的历史数据。注意“保留30天的最新数据”,可能不是连续的30天,中间若某一天数据缺失,也必须把最新的30天的数据保留下来。

    思路:获取所有数据路径列表,去除最新30天的数据路径,然后遍历删除。若是使用脚本语言来开发(如php,python),循环获取路径列表的代码就已经比较臃肿了,效率也不高,特别是文件目录特多的时候。使用shell应该更方便和高效

    rm -rf `find /data/*/*/*/ -type d|awk '{a[NR]=$0}END{n=asort(a,sa)-30;for(i=1;i<=n;i++){print sa[i]}}'`

    词命令还存在一个隐患,rm的参数字符长度可能超过1024的限制,修改如下

    find /data/*/*/*/ -type d|awk '{a[NR]=$0}END{n=asort(a,sa)-30;for(i=1;i<=n;i++){print sa[i]}}'|xargs -I{} rm -rf {}

    这个命令里使用了find,效率还是有些不满意,使劲的寻找更高效获取路径列表的方式。哈哈,黄天不负苦心人啊,终于找到一个

    echo /data/*/*/*/|awk '{for(i=1;i<=NF;i++){a[i ]=$i}}END{n=asort(a,sa)-30;for(i=1;i<=n;i++){print sa[i ]}}'|xargs -I{} rm -rf {}

    使用time命令测试运行速度,第二条命令和第三条命令其运行时间分别是0.007s和0.002s,后者快了3倍

    但郁闷的是,我不知道“echo /data/*/*/*/“到底是怎么个原理,有什么限制等等,网上也还没有搜索到相关资料,有知道的朋友请告知一下啊


    2013-10-17 编辑补充:

    原命令还可以修改精简一下,通过指定awk使用的换行符来避免for循环

    echo /data/*/*/*/|awk 'BEGIN{ORS=RS=" "}{a[NR]=$0}END{n=asort(a,sa)-30;for(i=1;i<=n;i++){print sa[i ]}}'|xargs -I{} rm -rf {}

    还有一个问题就是,你可能想在日志中记录下删除了那些文件。可以先把文件列表赋值给一个变量,记录日志后再删除

    files=`echo /data/*/*/*/|awk 'BEGIN{ORS=RS=" "}{a[NR]=$0}END{n=asort(a,sa)-30;for(i=1;i<=n;i++){print sa[i ]}}'`
    echo $files; #输出日志
    echo -e ${files// /" "}|xargs -I{} rm -rf {}
    关键是最后一行, echo 的-e参数是为了可以输出 换行,如无此参数则不会识别。
    ${files// /" "} 是把变量files里的所有空格都替换成 换行符,这样xargs才能正确切分参数。不知道为什么会这样


    2015-4-16 继续优化命令


    files=`ls -1 -r /data/*/*/*/ | awk 'NR>=30{print $0}'`
    echo $files; #输出日志
    echo -e $files | xargs -I{} -d " " rm -rf {}

    说明:
    ls :  -1参数表示一个文件或目录单独占一行显示, -r 表示按路径降序排列(默认是升序排列)

    xargs: -d 参数设置分隔符


    ---------------------
    作者:five-zh
    来源:CSDN
    原文:https://blog.csdn.net/tsxw24/article/details/12013753
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    面试(串讲三)
    未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“Microsoft.VisualStudio.Data.Providers.SqlServer.SqlViewSupport.xml”正确嵌入或链接到程序集“Microsoft.VisualStudio.Data.Providers.SqlServer”,或者确保所有需要的附属程序集都可加载并已进行了完全签名。
    爬虫-js逆向记录1
    Spring Boot前后端分离直接访问静态页+ajax实现动态网页
    MODBUS-TCP通讯协议V1.03
    vs2019调试时,取消线程abort终止导致异常中断方法
    TCP/IP报文分析
    专业免费的图片、照片去灰底、修复软件,专业人员都在用它
    c指针的传递
    golang实现三重DES加密解密
  • 原文地址:https://www.cnblogs.com/zgq123456/p/9855815.html
Copyright © 2011-2022 走看看