Мне нужно перебрать 1,5 миллиона файлов на диске. Я сейчас делаю:
sudo chown -R www-data:www-data /root-of-device
но бегать нужно очень долго. Мне было интересно, есть ли какой-то сверхбыстрый низкоуровневый способ перехватить каждый файл на диске.
Использовать xargs -p
или GNU parallel
чтобы значительно ускорить процесс.
К сожалению, я не думаю, что такое есть, но был бы приятно удивлен, если бы он был. Вы можете написать свою собственную реализацию на C и сильно ее оптимизировать. Однако успех этого зависит от того, насколько хорошо оптимизирован Chown это для начала. Учитывая, что это одна из основных утилит, я бы сказал, что она довольно оптимизирована. Вдобавок вы, скорее всего, ограничены скоростью ввода-вывода.
Мне удалось избежать ограничений ls и rm путем передачи результатов найти к xargs, если в каталоге много файлов, то есть:
find /path/* | xargs rm
Итак, дикая догадка, может быть, это может ускорить Chown, в случае, если рекурсивное сканирование файловой системы выполняется медленнее, чем найти:
sudo find /path/* | xargs chown www-data:www-data
Я тоже использую Amazon EC2, и у меня возникла эта проблема. 2 вещи:
Исправление текущей ситуации: Вам придется иметь дело с медлительностью. Возможно, вы можете использовать «экран» или что-то подобное, чтобы процесс мог продолжаться в фоновом режиме.
Исправление будущей ситуации: Вы можете посмотреть вверх по течению и увидеть, как файлы генерируются в первую очередь. Поскольку вы упомянули www-data, я предполагаю, что потребителем файлов является Apache. Если файлы удаляются из другой программы (NFS, Samba, SSH и т. Д.), Убедитесь, что эти программы устанавливают user: group как www-data: www-data.