Hadoop & Bash: удалить имена файлов, соответствующие диапазону - PullRequest
5 голосов
/ 12 октября 2011

Скажем, у вас есть список файлов в HDFS с общим префиксом и инкрементным суффиксом.Например,

part-1.gz, part-2.gz, part-3.gz, ..., part-50.gz

Я хочу оставить только несколько файлов в каталоге, скажем 3. Все три файла подойдут.Файлы будут использоваться для тестирования, поэтому выбор файлов не имеет значения.

Какой самый простой и быстрый способ удалить 47 других файлов?

Ответы [ 5 ]

16 голосов
/ 12 октября 2011

Несколько вариантов здесь:


Переместите три файла вручную в новую папку, затем удалите старую папку.


Захватите имена файлов с помощью fs -ls,затем потяните верхнюю часть n, затем нажмите их.На мой взгляд, это самый надежный метод.

hadoop fs -ls /path/to/files дает вывод ls

hadoop fs -ls /path/to/files | grep 'part' | awk '{print $8}' выводит только имена файлов (отрегулируйте grep соответственно, чтобы получить нужные файлы)).

hadoop fs -ls /path/to/files | grep 'part' | awk '{print $8}' | head -n47 захватывает верх 47

Бросьте это в цикл for и запишите их:

for k in `hadoop fs -ls /path/to/files | grep part | awk '{print $8}' | head -n47`
do
   hadoop fs -rm $k
done

Вместо цикла for вы могли быиспользовать xargs:

hadoop fs -ls /path/to/files | grep part | awk '{print $8}' | head -n47 | xargs hadoop fs -rm

Спасибо Кейту за вдохновение

4 голосов
/ 12 октября 2011

In Bash?

Какие файлы вы хотите сохранить и почему?Как их зовут?В приведенном выше примере вы можете сделать что-то вроде этого:

$ rm !(part-[1-3].gz)

, который удалит все файлы, кроме part-1.gz, part-2.gz и part-3.gz.

Вы также можете сделать что-то вроде этого:

$ rm $(ls | sed -n '4,$p')

, который удалит все, кроме трех последних перечисленных файлов.

Вы также можете сделать это:

$ls | sed -n '4,$p' | xargs rm

Что безопаснее, если у вас есть сотни и сотни файлов в каталоге.

3 голосов
/ 12 октября 2011

Вам нужно оставить первый три или последний три?

Чтобы удалить все, кроме первых трех:

hadoop fs -ls | grep 'part-[0-9]*\.gz' | sort -g -k2 -t- | tail -n +4 | xargs -r -d\\n hadoop fs -rm

Чтобы удалить все, кроме трех последних:

hadoop fs -ls | grep 'part-[0-9]*\.gz' | sort -g -k2 -t- | head -n -3 | xargs -r -d\\n hadoop fs -rm

Обратите внимание, что эти команды не зависят ни от фактического количества файлов, ни от наличия более трех, ни от точной сортировки исходного списка, но они зависят от того факта, что число идет после дефис. Параметры xargs не являются строго необходимыми, но они могут быть полезны в определенных ситуациях.

1 голос
/ 12 октября 2011

awk:

  ls part-*.gz|awk -F '[-\.]' '$2>3{print "rm "$0}' |sh
1 голос
/ 12 октября 2011
ls part-*.gz | sed -e "1,3d" | xargs rm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...