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

时间:2017-07-03 09:27:02

标签: shell hadoop hdfs

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

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

我该怎么办? mindepth命令中的maxdepthfind选项在HDFS中不起作用。

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

base目录为/user/abhikaushik

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

2 个答案:

答案 0 :(得分:6)

这个怎么样:

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" "

获取所需的列:

  

cut -d' ' -f6-8

使用awk处理:

  

AWK

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

  

RETENTION_DAYS = 10;

     

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

     

"日期+%s" | getline NOW

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

  

cmd =" date -d' \''" $ 1" " $ 2#34;' \'' +%S&#34 ;;

执行命令以获取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天)。

希望这有帮助!

答案 1 :(得分:1)

试试这个 -

删除2017-0至8中创建的所有文件。

hadoop fs -rm -r `hadoop fs -ls -R <location> | grep '.*2017-[0-8].*' | awk '{print $8}'`