gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:22:16 25 4
gpt4 key购买 nike

我想编写一个数据保留 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com