Hadoop - 仅删除超过X天的文件

ak0*_*817 0 shell hadoop hdfs

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

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

我该怎么办?命令中的mindepthmaxdepth选项find在HDFS中不起作用.

基目录可以具有多个子目录,这些子目录可以具有子目录等等.

base 目录是 /user/abhikaushik

然后我们有yyyy/mm/dd/hhbase/2017/04/23/22base/studies/programming/file1.txt等等形式的子文件夹

dae*_*n12 7

这个怎么样:

hdfs dfs -ls -R /MY/BASE/DIR/PATH | grep "^-" | tr -s " " | cut -d' ' -f6-8 | awk 'BEGIN{ RETENTION_DAYS=10; LAST=24*60*60*RETENTION_DAYS; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF > LAST){ print $3 }}'

哪里,

递归列出所有文件:

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

从列表中只获取FILES:

grep"^ - "

替换额外的空格:

tr -s""

获取所需的列:

切-d'' - f6-8

使用awk处理:

AWK

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

RETENTION_DAYS = 10;

LAST = 24个*60个*60个*RETENTION_DAYS;

"日期+%s"| getline NOW

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

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

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

cmd | getline WHEN;

获得时差:

DIFF = NOW-WHEN;

根据差异打印输出:

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

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


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

现在,不是print在最后一步中执行操作,而是可以执行您真正想要的操作,即删除旧的FILES,如下所示:

hdfs dfs -ls -R /MY/BASE/DIR/PATH | grep "^-" | tr -s " " | cut -d' ' -f6-8 | awk 'BEGIN{ RETENTION_DAYS=10; LAST=24*60*60*RETENTION_DAYS; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF > LAST){ system("hdfs dfs -rm -r -skipTrash "$3 ) }}'

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

希望这可以帮助!