LinuxForum.Fans
Тема

Удаление большого количества файлов

Автор: aka 16 сообщений 5951 просмотров
#188080

Понимаю, что тема стара как мир, но все же осмелюсь:)

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

Собственно проблема в том, что там около 2-3 миллионов файлов и это продакшн.

Руки чесали на find, но понимаю find делает сначала листинг, а потом только работает, что по мнению пробовавших около недели или больше при таких объемах) Сам я еще не пробовал, если честно...

Куда смотреть, что бы корректно удалить все это множество?:)

#188104
text
rm */*/*

мне кажется так можно...

#188114
aka написал:
Руки чесали на find, но понимаю find делает сначала листинг, а потом только работает, что по мнению пробовавших около недели или больше при таких объемах)

вас ввели в заблуждение: find сразу удаляет (find -delete).

zvezdochots написал:
rm */*/*
мне кажется так можно...

а вот тут будет листинг в памяти (много гигов ОЗУ потрачено будет), а потом уже удаление.
и каталоги тоже убьёте. Что недопустимо по условию.

aka написал:
Куда смотреть, что бы корректно удалить все это множество?:)

man find

#188120

Для рекурсивного копирования файлов (на примере телефонов Nokia) использую такой скрипт:
[console]find <old-catalog> -type f -name '*' | xargs cp -t <new-catalog>[/console]
Нашёл здесь
Для удаления можно составить аналогично. Опции для поиска определённых типов файлов есть в man find

#188121
drBatty написал:
а вот тут будет листинг в памяти (много гигов ОЗУ потрачено будет), а потом уже удаление.
и каталоги тоже убьёте. Что недопустимо по условию.

не говоря уже о том, что вообще не заработает.... скажет, что мол слишком много аргументов...

#188128

Удалял, как и Ranyar, при помощи find + xargs

#188134
Ranyar написал:
Для рекурсивного копирования файлов (на примере телефонов Nokia) использую такой скрипт:
Консоль:

find <old-catalog> -type f -name '*' | xargs cp -t <new-catalog>

выделенное лишнее.

Ranyar написал:
Для удаления можно составить аналогично.

не нужно. удалять умеет сама find, без костыля xargs.

Fat-Zer написал:
не говоря уже о том, что вообще не заработает.... скажет, что мол слишком много аргументов...

ну сначала повесит намертво сервак, а потом скажет :o
если OOM Killer не грохнет раньше :O

Показать
а вообще, свои "советы" проверять надо.
#188167

drBatty, я свой метод проверил, каталоги не удаляются.
[console]
mihail@ProToshiba:~$ mkdir test
mihail@ProToshiba:~$ cd test
mihail@ProToshiba:~/test$ mkdir 1 2 3
mihail@ProToshiba:~/test$ touch 1/1 1/2 1/3
mihail@ProToshiba:~/test$ touch 2/1 2/2 2/3
mihail@ProToshiba:~/test$ touch 3/1 3/2 3/3
mihail@ProToshiba:~/test$ ls
1 2 3
mihail@ProToshiba:~/test$ ls 1 && ls 2 && ls 3
1 2 3
1 2 3
1 2 3
mihail@ProToshiba:~/test$ rm */*
mihail@ProToshiba:~/test$ ls
1 2 3
mihail@ProToshiba:~/test$ ls 1 && ls 2 && ls 3
[/console]

#188173
zvezdochots написал:
я свой метод проверил, каталоги не удаляются.
zvezdochots написал:
$ rm */*
zvezdochots написал:
rm */*/*

э...
почти никакой разницы...

#188188

подобная задача была на одном из собеседований в yandex. Был еще вопрос в тему find : как можно посмотреть листинг каталога без помощи ls )

#188198
riso написал:
подобная задача была на одном из собеседований в yandex.

не знаю как там на собеседовании (думаю также), но в продакшене такое сплошь и рядом. Когда какой-то криворукий идиот забыл сделать очистку, и ВНЕЗАПНО кончились inodes. :(
find самое быстрое. Но удалить миллионы файлов - это вам не фунт изюму.
Звёздочка ещё дольше, если конечно она вообще сработает (что не факт).

riso написал:
Был еще вопрос в тему find : как можно посмотреть листинг каталога без помощи ls )

как вам:
[console]$ echo *[/console]
?
Казалось-бы, причём тут find? ;)

#188397

Удалилось ~110Гб, количество файлов 1723843, сервер был в продакшне, проблем не возникло кроме небольшого LA, что логично. Длилось около 1часа 20 минут, но думаю ,если бы не писал в файл и не продакт, то было бы быстрее.

Выглядело так:

[console]find /mnt/dataf/ -mtime +183 -type f -delete -print 2>&1 >> /data/files_delete.report2[/console]

Спасибо всем большое! :)

#188415

Казалось-бы, причём тут find?

find . -print был ответ, правда листинг будет рекурсивный. echo * конечно тоже можно.

#188424

эм, dir и dir -l еще:)

#188450
riso написал:
find . -print был ответ

-print это поведение по умолчанию. можно просто find.

riso написал:
правда листинг будет рекурсивный.

find -maxdepth 1
если хочется 1й уровень.

aka написал:
эм, dir и dir -l еще:)

dir это alias для ls.

#188496

за find -maxdepth 1 спасибо. Ман читать лень же.

Войдите или зарегистрируйтесь, чтобы ответить.