我有一个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