каталог с метаданными 980 МБ, миллионы файлов, как его удалить? (ext3)

каталог с метаданными 980 МБ, миллионы файлов, как его удалить? (ext3)

Возможный дубликат:
rm в каталоге с миллионами файлов

Привет,

Итак, я застрял в этом каталоге:

drwxrwxrwx 2 dan users 980M 2010-12-22 18:38 sessions2

Содержимое каталогов невелико — всего лишь миллионы крошечных файлов.

Я хочу стереть его из файловой системы, но не смог. Моя первая попытка была:

find sessions2 -type f -delete

и

find sessions2 -type f -print0 | xargs -0 rm -f

но пришлось остановиться, потому что оба вызвали эскалацию использования памяти. В какой-то момент он использовал 65% памяти системы.

Поэтому я подумал (без сомнения, неправильно), что это связано с тем, что dir_index был включен в системе. Возможно, find пытался прочитать весь индекс в память?

Поэтому я сделал это (по глупости):tune2fs -O^dir_index /dev/xxx

Хорошо, так и должно быть. Запустил findкоманду выше еще раз и... то же самое. Безумное использование памяти.

Я поспешил tune2fs -Odir_index /dev/xxxвключить dir_index и столкнулся с ошибкой Server Fault!

2 вопроса:

1) Как мне избавиться от этого каталога в моей живой системе? Мне все равно, сколько времени это займет, лишь бы это использовало мало памяти и мало ЦП. Кстати, с помощью nice find ...мне удалось снизить использование ЦП, так что сейчас моя проблема только в использовании памяти.

2) Я отключил dir_index примерно на 20 минут. Несомненно, за это время в файловую систему были записаны новые файлы. Я снова включил dir_index. Означает ли это, что система не найдет файлы, записанные до повторного включения dir_index, поскольку их имена файлов будут отсутствовать в старых индексах? Если это так и я знаю, что эти новые файлы не важны, могу ли я сохранить старые индексы? Если нет, как мне перестроить индексы? Можно ли это сделать на работающей системе?

Спасибо!

решение1

См. этот вопрос:rm в каталоге с миллионами файлов

Это был мой ответ, но были и другие замечательные ответы:

Можно ли сделать резервную копию всех остальных файлов этой файловой системы во временном хранилище, переформатировать раздел, а затем восстановить файлы?

решение2

Я бы предпочел убрать текущий каталог, создать новый, а затем удалить старый:

mv dirname dirname.old; mkdir dirname ls -ld dirname dirname.old # проверка правильности прав доступа rm -rf dirname.old

Это имеет дополнительное преимущество, поскольку в вашей истории не останется «rm -rf dirname», который вы можете случайно запустить повторно. :-)

"rm -rf" должен удалить каталог, используя лишь очень мало памяти. Но команды "find", которые вы запускали ранее, также не должны использовать много памяти. Как вы измеряете использование памяти?

Вы ведь не измеряете это использование памяти, глядя на столбец "free" вывода команды "free", не так ли? Потому что Linux будет использовать неиспользуемую память для кэширования диска, а верхний столбец под "free" не учитывает это. Вы видите использование памяти в одной из программ? Какой именно? "ps awwlx --sort=vsz" покажет вам большую память, использующую программы, отсортированную так, что большие программы окажутся в конце...

решение3

Ваша проблема в том, что вы передаете его в xargs... вероятно, он съедает всю вашу память... у find есть опция удаления

find sessions2 -type f -delete

решение4

Хм, безумная идея, не знаю, сработает ли. А что если попробовать сделать это партиями? Сначала переименовать каталог и создать новый пустой, чтобы новые файлы не мешали. Затем вывести содержимое каталога в текстовый файл. Затем пройтись по этому файлу и удалить по 100 файлов за раз, переходя в спящий режим и синхронизируясь между этим?

Связанный контент