Понимаю, что тема стара как мир, но все же осмелюсь:)
Есть дерево директорий, три уровня вложенности. Необходимо удалить все файлы, но не папки в этом дереве в любой из поддиректорий полугодичной давности и больше.
Собственно проблема в том, что там около 2-3 миллионов файлов и это продакшн.
Руки чесали на find, но понимаю find делает сначала листинг, а потом только работает, что по мнению пробовавших около недели или больше при таких объемах) Сам я еще не пробовал, если честно...
Куда смотреть, что бы корректно удалить все это множество?:)
Удаление большого количества файлов
rm */*/*мне кажется так можно...
Руки чесали на find, но понимаю find делает сначала листинг, а потом только работает, что по мнению пробовавших около недели или больше при таких объемах)
вас ввели в заблуждение: find сразу удаляет (find -delete).
rm */*/*
мне кажется так можно...
а вот тут будет листинг в памяти (много гигов ОЗУ потрачено будет), а потом уже удаление.
и каталоги тоже убьёте. Что недопустимо по условию.
Куда смотреть, что бы корректно удалить все это множество?:)
man find
а вот тут будет листинг в памяти (много гигов ОЗУ потрачено будет), а потом уже удаление.
и каталоги тоже убьёте. Что недопустимо по условию.
не говоря уже о том, что вообще не заработает.... скажет, что мол слишком много аргументов...
Удалял, как и Ranyar, при помощи find + xargs
Для рекурсивного копирования файлов (на примере телефонов Nokia) использую такой скрипт:
Консоль:
find <old-catalog> -type f -name '*' | xargs cp -t <new-catalog>
выделенное лишнее.
Для удаления можно составить аналогично.
не нужно. удалять умеет сама find, без костыля xargs.
не говоря уже о том, что вообще не заработает.... скажет, что мол слишком много аргументов...
ну сначала повесит намертво сервак, а потом скажет :o
если OOM Killer не грохнет раньше :O
Показать
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]
я свой метод проверил, каталоги не удаляются.
$ rm */*
rm */*/*
э...
почти никакой разницы...
подобная задача была на одном из собеседований в yandex. Был еще вопрос в тему find : как можно посмотреть листинг каталога без помощи ls )
подобная задача была на одном из собеседований в yandex.
не знаю как там на собеседовании (думаю также), но в продакшене такое сплошь и рядом. Когда какой-то криворукий идиот забыл сделать очистку, и ВНЕЗАПНО кончились inodes. :(
find самое быстрое. Но удалить миллионы файлов - это вам не фунт изюму.
Звёздочка ещё дольше, если конечно она вообще сработает (что не факт).
Был еще вопрос в тему find : как можно посмотреть листинг каталога без помощи ls )
как вам:
[console]$ echo *[/console]
?
Казалось-бы, причём тут find? ;)
Удалилось ~110Гб, количество файлов 1723843, сервер был в продакшне, проблем не возникло кроме небольшого LA, что логично. Длилось около 1часа 20 минут, но думаю ,если бы не писал в файл и не продакт, то было бы быстрее.
Выглядело так:
[console]find /mnt/dataf/ -mtime +183 -type f -delete -print 2>&1 >> /data/files_delete.report2[/console]
Спасибо всем большое! :)
Казалось-бы, причём тут find?
find . -print был ответ, правда листинг будет рекурсивный. echo * конечно тоже можно.
эм, dir и dir -l еще:)
find . -print был ответ
-print это поведение по умолчанию. можно просто find.
правда листинг будет рекурсивный.
find -maxdepth 1
если хочется 1й уровень.
эм, dir и dir -l еще:)
dir это alias для ls.
за find -maxdepth 1 спасибо. Ман читать лень же.