我想编写一个数据保留 shell 脚本,当给定两个输入时 - 基本目录和保留期(以天为单位)仅删除超过保留期的文件(而不是目录)。我在互联网上搜索过,也有一些解决方案,但他们是列出目录并根据修改时间删除它们。
但是一个目录可能有一个非常旧的时间戳,但可能包含最近更新的文件。
我该如何进行? find
命令中的 mindepth
和 maxdepth
选项在 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/PATH
和 RETENTION_DAYS
的值。
希望这对您有所帮助!
关于shell - Hadoop - 只删除早于 X 天的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44882051/