Как скопировать в несколько потоков?

Задача скопировать 54Млн файлов
занято уже 95% диска
Написал скрипт который по отдельности сжимал папки и копировал на удалённый сервер там распаковывал.
Но проблема в том что даже для 1 папки места нет, а у некоторых и у подкаталогов такая же ситуация.
В общем слишком много исключений в циклах пришлось делать и тд.
Если же копировать в 1 поток то 320 часов
Собственно поскольку при копирование файлов пролемма не в размере а в количестве, то есть идея копировать скажем в 100 потоков, тем самым сократив до 3 часов, что вполне себе уже жизнеспособно I-O nvme дисков это вообще никак не потревожит.
по идее что-то через find (с макс деп3) и xargs
может кто подскажет как лучше сделать, в идеале примерчик.
Все это веселье заправляется работой 24\7 и потом мне нужно будет расхождения отдельно скопировать в общем желательно чтоб если-что то все это было еще и повторяемо.
  • Вопрос задан
  • 591 просмотр
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
Написал скрипт который по отдельности сжимал папки и копировал на удалённый сервер там распаковывал

Так сжимайте сразу на удаленный сервер

tar cvfz - mydirectory|ssh user@remote_server "cd target_directory;tar xvfz -"


Или даже проще будет запустить несколько экземпляров rsync в фоне через xargs или parallel
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
gbg
@gbg
Любые ответы на любые вопросы
Что-то такое, с использованием GNU Parallel

find . -print0 | parallel -0 -j10 cp {} destdir

Источник
Ответ написан
Комментировать
@MechanID
Админ хостинг провайдера
Не совсем понимаю чем мешает недостаток места на источнике.
Что делать - зависит от структуры каталогов и распределения данных в них, например сделать список каталогов 2го или 3его или Нного уровня и на каждый каталог запустить свой rsync.
Ответ написан
Комментировать
hint000
@hint000
у админа три руки
Просто направление, без примера.
Сформировать текстовый файл (на 54 млн. строк) со списком файлов.
Разделить его на 100 файлов по 540 тыс. строк; грубо, количество строк будет разное, но в данном случае не принципиально: split -n l/10 имя_файла
В цикле (по 100 файлам) запустить фоном процессы копирования, принимающие список из файла.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы