1

У меня есть папка, которая в любое время должна иметь менее 500 тыс. Папок. Эти папки создаются динамически, и когда файлы (изображения) внутри них удаляются каким-либо сценарием, сама папка также должна быть удалена. Из-за ошибки удаление пустых папок не было сделано, и теперь мы получили миллионы пустых папок ...

Итак, на данный момент у меня есть около 500 тыс. Папок с файлами в них, а также миллионы пустых папок.

Потому что там так много папок, даже простой ls | wc -l занимает часы, поэтому даже не могу найти точное число.

Я мог бы запустить команду поиска: найти. -maxdepth 1-type d -empty; и затем отправьте его с помощью rmdir; но опять же, поиск занимает много времени (или даже использует опцию -delete для поиска предложений)

Затем у меня появилась идея использовать rmdir --ignore-fail-on-non-empty /path /to / огромный / папка / *; но я не уверен в его эффективности. По сути, эта команда удаляет только пустые каталоги в моей папке, что означает, что те, в которых есть файлы, должны быть безопасными, а не удалены. Затем опция --ignore-fail-on-non-empty игнорирует сотни тысяч или предупреждений для папок, которые на самом деле не пусты.

Я быстро создал около 100 тыс. Пустых папок в своей локальной сети, затем «коснулся» нескольких файлов в некоторых из них и затем использовал команду rmdir. Хотя создание 100 тыс. Пустых папок заняло 2 минуты, это заняло 2 секунды (!) удалить пустые. Так что мои надежды велики, но я не уверен, как он будет обрабатывать около 10 миллионов папок ... (Полагаю, я мог бы использовать ionice, чтобы остановить блокировку системы на случай, если на самом деле это займет много лет)

Если у кого-то есть какие-либо идеи / советы или кто-то сталкивался с чем-то подобным, не могли бы вы указать мне, как лучше всего подойти к моей проблеме. Или даже сказать мне, какой путь лучше пойти: найти или Rmdir ...

РЕДАКТИРОВАТЬ: я забыл упомянуть структуру папок раньше. Папки в основной папке, в которых есть файлы, больше не содержат папок. Другие папки пусты. Таким образом, все эти миллионы папок могут быть пустыми или содержать файлы, но папок больше нет. В общем, в древовидной структуре есть только один уровень папок.

1 ответ1

0

На самом деле, не зная, сколько у вас каталогов, трудно предсказать, какой подход будет вести себя, но я могу сказать вам следующее:

find . -maxdepth 1 -type d -empty -delete

это очень плохая идея. поиск очень медленный, когда дело доходит до удаления вещей. Когда я тестировал его, переключатель -delete был в 40-50 раз медленнее, чем оптимальный подход.

Точно так же,

rmdir --ignore-fail-on-non-empty /path/to/huge/folder/*

должно быть неоптимальным. Оболочка расширит глобус до всех записей каталога (файлов и папок) и, даже прежде чем передать их в rmdir, отсортирует их по алфавиту, что займет время и совершенно не нужно.

Комбинированный подход должен быть лучшим:

find . -maxdepth 1 -type d -empty -exec rmdir {} +

Обратите внимание, что знак плюс в конце позволяет избежать вызова rmdir для каждого отдельного каталога. Вместо этого find собирает столько имен каталогов, сколько может уместиться в 128 КиБ (из-за ограничения ядра для аргументов командной строки) и выполняет rmdir для всех них одновременно.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .