我正在尝试编写一个每天在cron上运行的bash脚本,它会查看hdfs位置并删除该路径中已存在超过一周的文件。我对不同的bash命令做了很多研究,但说实话我不知道从哪里开始。任何人都可以帮助我,或者至少引导我朝着正确的方向前进吗?
在此明确。我从来没有写过一个bash脚本,这就是我不知道从哪里开始的原因。
答案 0 :(得分:0)
这个怎么样:
DAYS=7; # a week
hdfs dfs -ls -R /user/hduser/input | grep -v "^d" | tr -s " " | cut -d' ' -f6-8 | grep "^[0-9]" | awk -v DAYS="$DAYS" 'BEGIN{ BEFORE=24*60*60*DAYS; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF > BEFORE){ system("echo "$3) }}'
其中,
获取指定位置的所有文件的列表:
hdfs dfs -ls -R / user / hduser / input
从输出列表中删除目录(因为我们只想删除文件):
grep -v“^ d”
替换多余的空格以使输出空格分开:
tr -s“”
获取所需的列:
cut -d'' - f6-8
删除不需要的行:
grep“^ [0-9]”
使用awk处理: 将值传递给awk脚本以考虑删除阈值:
awk -v DAYS =“$ DAYS”
计算提供的DAYS的秒数值:
BEFORE = 24 * 60 * 60 *天;
以秒为单位获取当前时间戳:
“日期+%s”| getline NOW
创建命令以获取HDFS上文件的时间戳的纪元值:
cmd =“date -d'\''”$ 1“”$ 2“'\''+%s”;
执行命令以获取HDFS文件的纪元值:
cmd | getline WHEN;
获得时差:
DIFF = NOW-WHEN;
根据差异打印文件位置:
if(DIFF> BEFORE){print $ 3}
以上命令只列出早于指定DAYS数的文件。所以首先尝试它们,一旦你确定它工作正常,那么这里是从HDFS中删除文件所需的实际命令:
DAYS=7; # a week
hdfs dfs -ls -R /user/hduser/input | grep -v "^d" | tr -s " " | cut -d' ' -f6-8 | grep "^[0-9]" | awk -v DAYS="$DAYS" 'BEGIN{ BEFORE=24*60*60*DAYS; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF > BEFORE){ system("hdfs dfs -rm "$3) }}'
希望这有助于!!
答案 1 :(得分:-2)
所以如果HDFS它是一个文件扩展名,那么你可以在下一行添加到cron:
find /path/where/you/wannna -type f -name *.hdfs | xargs rm -rf
那应该删除扩展名中包含.hdfs的所有文件。