Как быстро удалить огромное количество файлов в каталоге на Linux/FreeBSD ?

Не редко у администраторов возникает задача быстрого удаления огромного количества файлов на Linux или FreeBSD. И как правило все используют классический способ с использованием rm -rf /directory/, но когда в каталоге 900 тыс. файлов, то удаление такого каталога с помощью rm может растянуться на долгие часы.

Более быстрый способ удаления — это синхронизация удаляемого каталога с пустым через rsync.
Суть простая — нужно rsync-ом положить пустой каталог в тот, который нужно очистить, с опцией -delete.

Итак, создаём пустой каталог:

mkdir /tmp/empty

Если у нас всё плохо и на диске создать каталог уже нельзя (закончилось место или inode), то нас всегда спасёт /dev/shm (на Linux):

mkdir /dev/shm/empty

Назначаем на каталог /tmp/empty те же права, которые сейчас у нас на том каталоге, который мы собираемся чистить (иначе каталог станет принадлежать root и туда никто потом не сможет писать), например:

chown www-data:www-data /tmp/empty
chmod 755 /tmp/empty

Начинаем всё удалять:

rsync -a --delete /tmp/empty/ /path/to/big/dir/

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


Подписаться
Уведомить о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

7 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
name
name
4 лет назад

find /path/to/big/dir/ -name «*» | xargs rm -rf

Ерванд
Ерванд
3 лет назад
Ответить на  Михаил Григорьев

Огромное спасибо, именно rsync за 20ч. справился с удалением 110млн файлов, которые наш коллега сгенерировал для тестирования clickhouse. Ни один метод описанный в статье https://habr.com/ru/post/157613/ даже не приступил к выполнению задачи.

Artem
Artem
1 год назад

Вот блин, поздно я загуглил, про «как удалить огромное кол-во файлов в Linux» ))
было 6 млн файлов, примерно по 5-6 Кб, find не смог, писал что-то типа «operation is too long». Удалял циклом «for f in *.new; do rm -rf «$f»; done» в несколько потоков — заняло примерно 19 часов. Сравнить бы с вашим методом интересно теперь. Надо будет как-то нагенерить файлов и попробовать.

Artem
Artem
1 год назад

Так, в общем попробовал я удаление файло вашим способом с rsync — и да! В разы быстрее удаляет, круто )
Но есть одно замечание (может это только у меня такой частный случай — VM, на которой проводил эксперимент, находится на VMWare):
после удаления файло я ничего не мог сделать с каталогом /path/to/big/dir/, а именно: создать в нём файл, выполнить du, удалить этот каталог (выполнение зависало и никак его ни ctrl+c, ни kill -9 процесса) пока я не удалил каталог /tmp/empty/. Смотел strace — ничего не увидел, не знаю, с чем это связано.
Такие дела.

7
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x