shell - Hadoop - 只删除早于 X 天的文件

标签 shell hadoop hdfs

我想编写一个数据保留 shell 脚本,当给定两个输入时 - 基本目录和保留期(以天为单位)仅删除超过保留期的文件(而不是目录)。我在互联网上搜索过,也有一些解决方案,但他们是列出目录并根据修改时间删除它们。

但是一个目录可能有一个非常旧的时间戳,但可能包含最近更新的文件。

我该如何进行? find 命令中的 mindepthmaxdepth 选项在 HDFS 中不起作用。

基本目录可能有多个子目录,子目录可能有子目录等等。

base 目录是 /user/abhikaushik

然后我们有yyyy/mm/dd/hh形式的子文件夹,比如base/2017/04/23/22 或者 base/studies/programming/file1.txt 等等

最佳答案

这个怎么样:

hdfs dfs -ls -R/MY/BASE/DIR/PATH | grep "^-"| tr -s ""|剪切-d' ' -f6-8 | awk 'BEGIN{ RETENTION_DAYS=10;最后=24*60*60*RETENTION_DAYS; “日期 +%s” |现在获取线路 } { cmd="date -d'\''"$1""$2"'\'' +%s";命令 |什么时候上线;差异=现在-时间; if(DIFF > LAST){ 打印 $3 }}'

在哪里,

递归列出所有文件:

hdfs dfs -ls -R /MY/BASE/DIR/PATH

仅从列表中获取FILES:

grep "^-"

替换多余的空格:

tr -s " "

获取所需的列:

cut -d' ' -f6-8

使用 awk 处理:

awk

初始化DIFF持续时间和当前时间:

RETENTION_DAYS=10;

LAST=24*60*60*RETENTION_DAYS;

"date +%s" | getline NOW

创建命令以获取 HDFS 上文件时间戳的纪元值:

cmd="date -d'\''"$1" "$2"'\'' +%s";

执行命令获取HDFS文件的epoch值:

cmd | getline WHEN;

获取时差:

DIFF=NOW-WHEN;

根据差异打印输出:

if(DIFF > LAST){ print $3 }}

-------------------------------------------- ----------------------------------


一旦您确定上面的命令列出了您要删除的文件,请继续

现在,除了在最后一步执行 print 操作,您可以执行您真正想要的操作,即删除旧文件,如下所示:

hdfs dfs -ls -R/MY/BASE/DIR/PATH | grep "^-"| tr -s ""|剪切-d' ' -f6-8 | awk 'BEGIN{ RETENTION_DAYS=10;最后=24*60*60*RETENTION_DAYS; “日期 +%s” |现在获取线路 } { cmd="date -d'\''"$1""$2"'\'' +%s";命令 |什么时候上线;差异=现在-时间; if(DIFF > LAST){ system("hdfs dfs -rm -r -skipTrash "$3 ) }}'

您只需根据您的要求(此处为 10 天)更改 /MY/BASE/DIR/PATHRETENTION_DAYS 的值。

希望这对您有所帮助!

关于shell - Hadoop - 只删除早于 X 天的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44882051/

相关文章:

linux - 如何在 Linux 中根据记录数拆分定界文本文件,该文件在数据字段中具有记录结尾分隔符

mysql - 动态 Shell 变量替换

hadoop - 什么是无状态节点? Hadoop 节点如何是无状态的?

java - 安装Chronix

unix - 我们可以使用EXPORT命令将hadoop数据复制到AWS S3吗?

hadoop - 检查HDFS中的目录是否为空

shell - 如何使用参数在 tchsh 中执行 tcl 脚本

linux - 如何在 vi 编辑器中删除特定行号?

Hadoop映射过程

java - Hadoop 3.1.2 无法从/webhdfs/v1/?op=LISTSTATUS : Server Error 检索数据