从脚本生成的文件中查找文件的创建日期.hadoop/hdfs



我有一个CMD输出,如下所示

hdfs fsck /data -files -blocks -locations -openforwrite
/data/prod/encrypt/fin1/dt=202203/FlumeData.1647955937413.tmp 378 bytes, replicated: repli                                                        cation=3, 1 block(s):  OK OPENFORWRITE
- BP-16266705-1.1.1.1-1481807115:blk_1141513_67850462 len=378 Live_repl=3  [DatanodeInfoWithSto                                                        rage[1.1.1.1:9866,DS-b6ff1d67-d842-49cb-8d3a-cd185bc03,DISK], DatanodeInfoWithStorage[1.1.1.1                                                        0:9866,DS-f69ec6eb-5884-4ab1-a583-5640336dd41d,DISK], DatanodeInfoWithStorage[1.1.1.1:9866,DS-16f08976-40ab-b369-dbdc0a268611,DISK]]

从成千上万的std输出中,我只对带有OPENFORWRITE标记的文件感兴趣,因此我运行了以下命令。

hdfs fsck /data -files -blocks -locations -openforwrite |grep -i openforwrite
/data/prod/encrypt/fin1/dt=202203/FlumeData.1647955937413.tmp 20075 bytes, replicated: replication=3, 1 block(s), OPENFORWRITE:  OK
/data/prod/encrypt/fin1/dt=202203/FlumeData.1647955937413.tmp 20075 bytes, replicated: replication=3, 1 block(s), OPENFORWRITE:  OK
/data/prod/encrypt/fin1/dt=202203/FlumeData.1647955937413.tmp 20075 bytes, replicated: replication=3, 1 block(s), OPENFORWRITE:  OK

现在,从上面的输出中,我需要找到/删除7天前的文件,我认为它应该很简单,所以我运行了下面的命令,但它无法获得日期或日期差异。

hdfs dfs -ls |
grep OPENFORWRITE |
cut  -d " " -f1 |
awk '
BEGIN{ MIN=10080; LAST=60*MIN; "date +%s" | getline NOW }
{
cmd="date -d'''"$1" "$2"''' +%s"; cmd | getline WHEN;
DIFF=NOW-WHEN; if(DIFF < LAST){ print $3 } 
}
'
date: invalid date '/data/prod/encrypt/fin1/dt=202203/FlumeData.1647955937413.tmp'

我该如何解决这个问题。谢谢MK-

建议使用readarray命令将行列表读取到行数组中。

然后通过find命令扫描一行中的每个文件。-mtime 7过滤

请注意7天前修改的不同文件:-mtime 7

-mtime +7文件在7天前被修改。

-mtime -7文件在不到7天前被修改。

注意过滤器可以组合时间范围逻辑过滤器:例如,过滤4-5天前的文件

-mtime -6 -and -mtime +4

建议:

readarray -t linesArr <<< $(hdfs fsck /data -files -blocks -locations -openforwrite |grep -i openforwrite)
for line in ${linesArr[@]}; do 
currFile=$(echo $line| awk '{print $1}')
if [[ $(find $currFile -mtime 7) ]]; then
echo "$line"
fi
done 

相关内容

  • 没有找到相关文章

最新更新