Не редко у администраторов возникает задача быстрого удаления огромного количества файлов на 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/
На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, PostgreSQL) на протяжении последних 24 лет.
find /path/to/big/dir/ -name «*» | xargs rm -rf
К сожалению, если в каталоге 100+ млн. файлов, то ваш способ либо вообще не сработает, либо будет работать намного медленней чем вариант через rsync
Огромное спасибо, именно rsync за 20ч. справился с удалением 110млн файлов, которые наш коллега сгенерировал для тестирования clickhouse. Ни один метод описанный в статье https://habr.com/ru/post/157613/ даже не приступил к выполнению задачи.
Пожалуйста :)
Вот блин, поздно я загуглил, про «как удалить огромное кол-во файлов в Linux» ))
было 6 млн файлов, примерно по 5-6 Кб, find не смог, писал что-то типа «operation is too long». Удалял циклом «for f in *.new; do rm -rf «$f»; done» в несколько потоков — заняло примерно 19 часов. Сравнить бы с вашим методом интересно теперь. Надо будет как-то нагенерить файлов и попробовать.
Так, в общем попробовал я удаление файло вашим способом с rsync — и да! В разы быстрее удаляет, круто )
Но есть одно замечание (может это только у меня такой частный случай — VM, на которой проводил эксперимент, находится на VMWare):
после удаления файло я ничего не мог сделать с каталогом /path/to/big/dir/, а именно: создать в нём файл, выполнить du, удалить этот каталог (выполнение зависало и никак его ни ctrl+c, ни kill -9 процесса) пока я не удалил каталог /tmp/empty/. Смотел strace — ничего не увидел, не знаю, с чем это связано.
Такие дела.
Добрый день!
Нужно было посмотреть через lsof закрылись ли все открытые дескрипторы и не держит ли что-то каталог /path/to/big/dir