我想编写一个数据保留shell脚本,当给定两个输入时 - 基本目录和保留期(以天为单位)删除仅保留期之前的文件(而不是目录)。我在互联网上搜索过并且有一些解决方案,但他们列出了目录并根据修改时间删除它们。
但目录可能有一个非常旧的时间戳,但可能包含最近更新的文件。
我该怎么办? mindepth
命令中的maxdepth
和find
选项在HDFS中不起作用。
基目录可能有多个子目录,可能有子目录等等。
base
目录为/user/abhikaushik
然后我们有yyyy/mm/dd/hh
形式的子文件夹,如base/2017/04/23/22
或base/studies/programming/file1.txt
等等
答案 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/PATH
和RETENTION_DAYS
的值,具体取决于您的要求(此处为10天)。
希望这有帮助!
答案 1 :(得分:1)
试试这个 -
删除2017-0至8中创建的所有文件。
hadoop fs -rm -r `hadoop fs -ls -R <location> | grep '.*2017-[0-8].*' | awk '{print $8}'`