如何删除多个hdfs目录中最近创建的文件?

nvbavucw  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(680)

我犯了一个错误,在一个按日期分区的表中添加了几百个部件文件。我可以看到哪些文件是新的(这些是我要删除的)。我在这里看到的大多数情况都与删除超过某个日期的文件有关,但我只想删除我最近的文件。
对于一天,我可能有3个这样的文件,我只想删除新文件。我可以看出它是新的,因为我使用hadoop fs-ls时有更新时间戳

/this/is/my_directory/event_date1_newfile_20191114
/this/is/my_directory/event_date1_oldfile_20190801
/this/is/my_directory/event_date1_oldfile_20190801

我有很多日期,所以我必须为event\u date2、event\u date3等完成此操作,总是从每个日期中删除“new\u file\u 20191114”。
旧的日期是2019年8月,我的新档案是昨天更新的,时间是11/14/19。
我觉得应该有一个简单/快速的解决方案,但我很难从大多数人所问的问题中找到相反的情况。

chhqkbe1

chhqkbe11#

正如你在回答中提到的,你已经得到了需要删除的文件列表。创建一个简单的脚本,将输出重定向到temp文件
这样地

hdfs dfs -ls /tmp | sort -k6,7 > files.txt

请注意排序-k6,7这将给出所有文件,但按时间戳的排序顺序。我确定你不想删除所有这样你就可以选择前n个文件,需要删除让我们说100
然后可以将命令更新为

hdfs dfs -ls /tmp | sort -k6,7 | head -100 |  awk '{print $8}' > files.txt

或者,如果您知道新文件的具体时间戳,那么您可以尝试下面的命令

hdfs dfs -ls /tmp | sort -k6,7 | grep "<exact_time_stamp>" |  awk '{print $8}' > files.txt

然后读取该文件并逐个删除所有文件

while read file; do
  hdfs -rm $file
  echo "Deleted $file" >> deleted_files.txt #this is to track which files have been deleted

done <files.txt

所以你完整的剧本可以是


# !/bin/bash

 hdfs dfs -ls /tmp | sort -k6,7 | grep "<exact_time_stamp>" |  awk '{print $8}' > files.txt

 while read file; do
     hdfs -rm $file
     echo "Deleted $file" >> deleted_files.txt #this is to track which files have been deleted

   done <files.txt

相关问题