Существует ли способ в macOS получить полный рекурсивный список каталогов из SMB-общего ресурса сразу, без явного обхода всех каталогов?

Вопрос или проблема

Включенная команда smbutil в macOS, похоже, не имеет такой возможности. Возможно, smbclient может это сделать, но эта команда, похоже, недоступна для macOS (по крайней мере, я не могу brew install её).

Моим текущим обходным решением является зависимость от SSH-соединения с моим файловым сервером (то, на что я ненавижу полагаться) и разбор результатов команды, выполняемой удаленно. Это НАМНОГО быстрее (~1 секунда против ~90 секунд), чем чтение верхнего каталога смонтированной SBM-доли, чтение всех её подкаталогов, затем под-подкаталогов и т.д.

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

Я работаю в TypeScript/NodeJS, поэтому предпочел бы что-то, к чему могу получить доступ без необходимости работы с кодом, специфичным для macOS, если можно этого избежать.

Ответ или решение

Теория:
Получение полного рекурсивного списка каталогов из SMB общего доступа напрямую через macOS представляет собой нетривиальную задачу, поскольку штатные средства, такие как smbutil, не предоставляют возможность рекурсивного обхода всех подкаталогов. SMB (Server Message Block) — это протокол сетевого обмена файлами, который позволяет приложениям читать и записывать файлы, а также запрашивать услуги от серверных программ в компьютерной сети. Однако, изначальная архитектура протокола не предполагает эффективного получения списка всех файлов и директорий за один вызов, что может замедлить процесс, если нужно обойти многочисленные подкаталоги.

Пример:
Ваш текущий подход с использованием SSH для удаленного выполнения команды на сервере более эффективен именно потому, что вы используете возможности операционной системы на сервере, которая может более быстро и эффективно обрабатывать файловую систему. При удаленном выполнении команда может напрямую обращаться к файловой системе сервера и оптимизировать доступ, при этом исключается передача большого объема метаданных через сеть, что происходит при использовании SMB.

Применение:
Для достижения цели—получения рекурсивного списка файлов без дополнительных зависимостей помимо SMB—есть несколько подходов, которые можно рассмотреть:

  1. Документация и существующие утилиты: Убедитесь, что вы исчерпали все возможности встроенных утилит, таких как smbutil. Характеристики и возможности этих инструментов могут изменяться, и стоит проверить документацию или обновления, которые могут добавить нужный функционал.

  2. Аналог smbclient для macOS: Несмотря на то, что smbclient из Samba распространен в Linux-системах, его использование напрямую на macOS без сборки из исходников затруднено. Однако существует возможность установки Samba из исходников на macOS или использования Docker-контейнеров, что может обеспечить функциональность smbclient в кросс-платформенной среде.

  3. Разработка собственного скрипта: Используя Node.js, можно создать сценарий, который подключается к SMB-доли и обходит директории. Существуют библиотеки, такие как node-smb2, которые поддерживают работу с SMB и могут быть использованы для написания кода, способного организовать рекурсивный обход. Возможно, вам придётся реализовать алгоритм обхода вручную, следовательно, оптимизируйте его для увеличения скорости.

  4. Отказ от необходимости в рекурсивном подходе: Оцените, действительно ли нужен полный рекурсивный список или же структура данных может быть пересмотрена. Например, можно кэшировать уже известные элементы и обновлять кэш по мере необходимости.

  5. Оценка альтернативных подходов: Всегда остается возможность использования FUSE-утилит, чтобы смонтировать SMB в файловую систему, которая поддерживает оптимизированный обход, или разработать кастомное решение с использованием C/C++ через API macOS.


Процесс поиска оптимальных решений на основе наличия только SMB-протокола на macOS может включать в себя многие перечисленные выше подходы, однако большее внимание стоит уделить возможности оптимального использования уже существующих инструментов и корректного подхода к кэшированию данных, чтобы избежать чрезмерной нагрузки на сетевое взаимодействие. Таким образом, хотя идеального готового инструмента для macOS может не существовать, комбинация нескольких стратегий и библиотек может привести к значительному ускорению работы с файлами на SMB-доле.

Оцените материал
Добавить комментарий

Капча загружается...