我想编写一个数据保留shell脚本,当给出两个输入时 - 基本目录和保留期(以天为单位)删除仅比保留期更早的文件(而不是目录).我在互联网上搜索过并且有一些解决方案,但他们列出了目录并根据修改时间删除它们.
但是目录可能具有非常旧的时间戳,但可能包含最近更新的文件.
我该怎么办?命令中的mindepth和maxdepth选项find在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 " " | 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/PATH并RETENTION_DAYS根据您的要求(此处为10天).
希望这可以帮助!