使用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//\ /"\n"}|xargs -I{} rm -rf {}
关键是最后一行, echo 的-e参数是为了可以输出\n换行,如无此参数则不会识别。
${files//\ /"\n"} 是把变量files里的所有空格都替换成\n换行符,这样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
版权声明:本文为博主原创文章,转载请附上博文链接!
使用shell巧妙高效的批量删除历史文件或目录的更多相关文章
- Hive批量删除历史分区
批量删除历史分区和数据可以采用如下操作: -- 删除20180101之前的所有分区 alter table example_table_name drop if exists partition (d ...
- svn:怎样批量删除.svn文件
怎样批量删除.svn文件 使用SVN工具的时候会生成一些以“svn”作为后缀的文件,而且每个文件夹下都有,如果想删除这些.svn文件夹,通过手动删除的渠道是很繁琐的事情. 通过以下的简单步骤可以在右键 ...
- Windows快速批量删除大量文件的命令
命令分别如下: rmdir [drive:]path [/S] [/Q] del [drive:]path [/S] [/Q] 其中rmdir 与rd命令相同. /S 表示除目录本身外,还将删除指定目 ...
- 如何禁止 Mac OS X 在外接设备上生成 .DS_Store 文件?以及如何批量删除 .DS_Store 文件?
如何禁止 Mac OS X 在外接设备上生成 .DS_Store 文件?以及如何批量删除 .DS_Store 文件?原文链接:http://www.java2class.net/bbs/viewthr ...
- 批量删除.svn文件夹和.svn文件
新建可运行文件 Windows环境 将下面的代码保存为 kill-svn.bat文件,放到要删除.svn文件的目录下,双击运行即可 @echo on @rem 删除SVN版本控制目录 @rem for ...
- 怎样批量删除PDF文件中的注释
日常我们在阅读一些PDF文章时候,我们会发现有些PDF文章带有非常多的注释,显得非常不美观,影响了阅读体验.那么PDF文章里的批注应该怎么进行删除呢?怎样批量删除PDF文件中的注释? 操作教程: ...
- 批量删除c文件和h文件中的注释
不知道大家有没有批量删除c文件和h文件中注释的需要,说起来搞笑,偶然翻出来早先写的一份,首先楼猪不是闲的蛋疼写这东西,工作需要,哪里要砖就要搬.冷门的东西大家需要的时候也不一定好找,分享给大家,省的自 ...
- 批量删除.svn文件夹、.svn文件
使用svn进行版本控制,每个文件夹下都有.svn文件夹,有些项目在脱离svn版本控制之后,想删除项目中所有的.svn文件夹,可用下面的方法进行快速删除: 1.打开要删除.svn文件的最外层文件夹, ...
- Linux删除乱码文件或者目录
Linux删除乱码文件或者目录 有时在Linux下面解压一些zip或者rar文件后会产生乱码文件或者目录,这个时候使用rm不能成功删除,需要使用一些特别的方法 来进行删除,下面是我经常使用的两种方法. ...
随机推荐
- 白话算法(6) 散列表(Hash Table)从理论到实用(中)
不用链接法,还有别的方法能处理碰撞吗?扪心自问,我不敢问这个问题.链接法如此的自然.直接,以至于我不敢相信还有别的(甚至是更好的)方法.推动科技进步的人,永远是那些敢于问出比外行更天真.更外行的问题, ...
- Python:代码单元、代码点介绍
转于:https://www.cnblogs.com/runwulingsheng/p/5106078.html 博主:你是那天边突然划过的一道闪电 代码点:指编码表(比如Unicode)中某个字符的 ...
- 杂项:TModJS
ylbtech-杂项:TModJS TmodJS(原名 atc)是一个简单易用的前端模板预编译工具.它通过预编译技术让前端模板突破浏览器限制,实现后端模板一样的同步“文件”加载能力.它采用目录来组织维 ...
- u-boot向linux内核传递启动参数
U-BOOT 在启动内核时,会向内核传递一些参数.BootLoader 可以通过两种方法传递参数给内核,一种是旧的参数结构方式(parameter_struct),主要是 2.6 之前的内核使用的方式 ...
- C# 利用委托和事件 传入一个参数进行进行计算并返回结果
一.委托定义 1: public class TestData 2: { 3: //定义委托 4: public delegate void Get_TestDataEventHandler(Get_ ...
- linux命令-bzip2压缩
gzip和bzip2 都是压缩命令 区别是压缩算法不一样 一般bzip2压缩的效率高 都不能压缩目录 bzip2 压缩 [root@wangshaojun ~]# bzip2 install.l ...
- UI面试题(1)
1.请创建一个数组对象[@“ad”,@“bc”,@“sdf”,@“yu”],并且对该数组对象进行排序(使用冒泡排序); NSMutableArray *array = [NSMutableArraya ...
- Flask03 路由控制(转换器)、反转、请求方法控制
1 提出问题 如何实现前端传过去的路径时动态的(即:多个url对应一个url视图函数) 例如: 浏览器中输入 http://127.0.0.1:5000/test/good/ 或者 http://12 ...
- 树莓派 Learning 002 装机后的必要操作 --- 03 替换软件源
树莓派 装机后的必要操作 - 替换软件源 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 树莓派的服务器实在太慢了!会导致你安装一个几M的东 ...
- BSGS(大小步)算法
BSGS算法主要用于求解形如ax≡b(mod p)的式子中x的值. 在这里我们不妨设 x=k1*n-k2 这时我们就可以将式子转化为 ak1*n≡b*ak2(mod p) 这里的n我们设为√p,所以我 ...