Вопрос или проблема
Включенная команда 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—есть несколько подходов, которые можно рассмотреть:
-
Документация и существующие утилиты: Убедитесь, что вы исчерпали все возможности встроенных утилит, таких как
smbutil
. Характеристики и возможности этих инструментов могут изменяться, и стоит проверить документацию или обновления, которые могут добавить нужный функционал. -
Аналог
smbclient
для macOS: Несмотря на то, чтоsmbclient
из Samba распространен в Linux-системах, его использование напрямую на macOS без сборки из исходников затруднено. Однако существует возможность установки Samba из исходников на macOS или использования Docker-контейнеров, что может обеспечить функциональностьsmbclient
в кросс-платформенной среде. -
Разработка собственного скрипта: Используя Node.js, можно создать сценарий, который подключается к SMB-доли и обходит директории. Существуют библиотеки, такие как
node-smb2
, которые поддерживают работу с SMB и могут быть использованы для написания кода, способного организовать рекурсивный обход. Возможно, вам придётся реализовать алгоритм обхода вручную, следовательно, оптимизируйте его для увеличения скорости. -
Отказ от необходимости в рекурсивном подходе: Оцените, действительно ли нужен полный рекурсивный список или же структура данных может быть пересмотрена. Например, можно кэшировать уже известные элементы и обновлять кэш по мере необходимости.
-
Оценка альтернативных подходов: Всегда остается возможность использования FUSE-утилит, чтобы смонтировать SMB в файловую систему, которая поддерживает оптимизированный обход, или разработать кастомное решение с использованием C/C++ через API macOS.
Процесс поиска оптимальных решений на основе наличия только SMB-протокола на macOS может включать в себя многие перечисленные выше подходы, однако большее внимание стоит уделить возможности оптимального использования уже существующих инструментов и корректного подхода к кэшированию данных, чтобы избежать чрезмерной нагрузки на сетевое взаимодействие. Таким образом, хотя идеального готового инструмента для macOS может не существовать, комбинация нескольких стратегий и библиотек может привести к значительному ускорению работы с файлами на SMB-доле.