Как дополнение:
Если обе директории (источник и назначение) находится на одном диске, то более правильно создавать хард-линки на файлы (но не на директории, их нужно создавать самому), а не тупо создавать новый inode для файла и копировать туда данные. Большинство тулз для копирования именно так и работают, это позволяет сберечь диск и уменьшить фрагментацию.
1. запускаем fs.readDir на папку.
2. в колбеке идем и говорим fs.stat на строку ответа
3. в колбеке смотрим файл это или папка. Если папка — то 1. В любом случае сохраняет список папкой и список файлов
4.Когда все готово…
5.создаем нужны папки в нужном месте
6.читаем файлы из исходника и пишем в дестинейшен, тут надо следить что-то колво потоков не зашкалило за max-open-files(100-300)
7.можно еще и за chmodить файлы данными из пункта 2
Все действия асинхронны.
По непонятным причинам работает на несколько порядков быстрее rsync в случае полного переноса данных.