使用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不能成功删除,需要使用一些特别的方法 来进行删除,下面是我经常使用的两种方法. ...
随机推荐
- 【Lintcode】363.Trapping Rain Water
题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...
- Hive安装配置要点
官网下载安装包: 在Profile下面定义HIVE_HOME以及HADOOP_HOME,然后在PATH下面添加HOME/bin目录,用于在命令行直接敲beeline,hive即可执行命令: 需要在ha ...
- 洛谷 P4525 & P4526 [模板] 自适应辛普森积分
题目:https://www.luogu.org/problemnew/show/P4525 https://www.luogu.org/problemnew/show/P4526 学习辛普森积分:h ...
- .NET接入微信支付(一)JS API接入 V3
前段时间刚接完银联支付,完事后又接了微信支付,前段时间一直急着上线,微信的接入一直没有时间处理,今天我们就来整理一下微信支付的接入方法和要点. 配置: 首先呢微信支付需要通过审核,审核啥的准备工作我就 ...
- VS Code:快捷方式
转于:vscode: Visual Studio Code 常用快捷键 博主:魚魚 更多操作参见官网:https://code.visualstudio.com/docs/getstarted/key ...
- Hadoop 1.2.1 MapReduce 例子
自学hadoop真的很困难,主要是hadoop版本太混乱了,各个版本之间兼容性并不算太好.更主要的是网上的很多MapReduce的Java例子不写import!!!只写类名!!!偏偏Hadoop中有很 ...
- 生物数据库介绍——NCBI
NCBI(National Center for Biotechnology Information,美国国家生物技术信息中心)除了维护GenBank核酸序列数据库外,还提供数据分析和检索资源.NCB ...
- ie浏览器float兼容性
在最近的项目中,遇到label.input.和button显示同一行,需求如下 实现代码,框架为react.js <label class="formGrid__label requi ...
- MVC项目中的分页实现例子
在开发项目中,写了一个分页实现的例子,现在把源代码贴上,以供以后写代码时参考 在列表的头部,有如下显示, 这个代表一个页面显示10条记录,总共22条记录. 这个是页面底部的显示 那么如何来显示这个分页 ...
- 微信小程序自学第二课:app及页面的生命周期、使用setData绑定数据
一.App声明周期 1.App() app.js中的App() 函数用来注册一个小程序.接受一个 object 参数,其指定小程序的生命周期函数等. 示例代码: App({ onLaunch: fun ...