Как удалить последние созданные файлы в нескольких каталогах HDFS?

Я сделал ошибку и добавил несколько сотен файлов в таблицу, разбитую по дате. Я могу видеть, какие файлы новые (это те, которые я хочу удалить). Большинство случаев, которые я видел здесь, связаны с удалением файлов старше определенной даты, но я хочу удалить только самые последние файлы.

В течение одного дня у меня может быть 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_date2, event_date3 и т. Д. И т. Д., Всегда удаляя new_file_20191114 из каждой даты.

Старые даты относятся к августу 2019 года, а мои новые файлы были обновлены вчера, 14.11.19.

Я чувствую, что должно быть простое / быстрое решение для этого, но мне трудно найти обратный случай из того, о чем спрашивает большинство людей.


person phenderbender    schedule 15.11.2019    source источник
comment
Я могу ошибаться, но, боюсь, я не думаю, что для этого есть одна строчка. Хотя должно быть только несколько строчек Bash.   -  person Ben Watson    schedule 15.11.2019
comment
у всех ваших новых файлов одинаковая метка времени? или временная метка новых файлов больше указанного времени?   -  person Strick    schedule 15.11.2019
comment
@Strick: да, именно так - мне удалось добиться некоторого прогресса, используя: hdfs dfs -ls /tmp | sort -k6,7 из этого сообщения: stackoverflow.com/questions/37022749/ Итак, я теперь у меня есть список конкретных файлов, которые мне нужно удалить, и теперь я пытаюсь найти способ массового удаления заранее созданного списка файлов.   -  person phenderbender    schedule 15.11.2019
comment
Я отправлю ответ   -  person Strick    schedule 15.11.2019
comment
Я опубликовал и отвечаю, пожалуйста, проверьте, решает ли он вашу цель   -  person Strick    schedule 15.11.2019


Ответы (1)


Как упоминалось в вашем ответе, у вас есть список файлов, которые необходимо удалить. Создайте простой скрипт, перенаправьте вывод во временный файл

нравится

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

Обратите внимание, что sort -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
person Strick    schedule 15.11.2019
comment
похоже, что ваше решение с использованием head -100 приближает меня еще больше. Я точно знаю, сколько файлов мне нужно удалить (самые последние 181 файл), и с учетом того, как он отсортирован, мне действительно нужно использовать tail -181. Итак, если я знаю точное количество файлов, я не думаю, что мне нужно использовать grep для отметки времени, это правильно? итак ... для моих целей это выглядит подходящим? - person phenderbender; 15.11.2019
comment
да, если вы знаете точные файлы, тогда не нужно использовать grep. но на всякий случай просто проверьте, выводит ли вывод hdfs dfs -ls / tmp | sort -k6,7 | grep ‹exact_time_stamp› | wc -l также или 180 или около того .. это только для перепроверки .. остальное, вы можете продолжить свой хвостовой подход - person Strick; 15.11.2019
comment
пожалуйста, посмотрите, я также использую awk '{print $ 8}', чтобы получить точный путь к файлу вместо других столбцов, вам также необходимо это проверить .. так что обновите это также в своей команде - person Strick; 15.11.2019
comment
Я не знаком с форматированием для grep, но мои временные метки либо 2019-11-14 21:03, либо 2019-11-14 21:04, все 181 файл был добавлен в этот двухсекундный диапазон - person phenderbender; 15.11.2019
comment
hdfs dfs -ls / tmp | sort -k6,7 | grep 2019-11-14 21:03 | wc -l аналогично для hdfs dfs -ls / tmp | sort -k6,7 | grep 2019-11-14 21:04 | wc -l и проверьте, что некоторые из обоих выходных данных приходят 181 - person Strick; 15.11.2019
comment
Позвольте нам продолжить это обсуждение в чате. - person Strick; 15.11.2019