Bash + rclone · OneDrive ↔ Google Drive · Открытое руководство по эксплуатации

Облачная передача только с копированием на Bash и rclone

rclone уже поддерживает постраничную загрузку из облака, повторные попытки, возобновляемую передачу и хеши провайдеров. Инженерная задача — обернуть эти базовые возможности в операционную процедуру, которая учитывает доступную ёмкость и при любой ошибке прекращает работу в безопасном состоянии.

Обновлено ; 20 мин чтения.

Краткий ответ

FileArk — более простой управляемый вариант для крупных миграций или миграций без постоянного наблюдения: он выполняет передачу онлайн, протестирован на объёмах в несколько терабайт и проверяет каждый результат перед завершением. Для операторов, которым нужен управляемый из командной оболочки маршрут данных, эта обёртка на Bash под лицензией MIT копирует ограниченные пакеты через локальное промежуточное хранилище, побайтово проверяет оба этапа и никогда не удаляет исходные файлы.

Зачем создавать обёртку для rclone вместо повторной разработки клиента каждого провайдера

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

Но это не делает задачу автоматической. Оператор по-прежнему отвечает за настройку удалённых хранилищ, безопасность токенов, доступность сети, контроль процесса, локальный диск, журналы, ограничения провайдеров, разбор ошибок отдельных объектов и приёмку данных в месте назначения. FileArk предназначен для пользователей, которые хотят, чтобы эта процедура выполнялась в виде управляемого онлайн-процесса, а не на их компьютере или сервере.

Скрипт принципиально никогда не вызывает rclone move, sync, delete, purge или rmdirs. Для обнаружения он использует lsf и about, для каждого этапа — copy, а для полной побайтовой проверки — check --download. Удаляется только проверенный файл из локального промежуточного каталога.

Скачайте версию на Bash и лицензию MIT

Скачать программу переноса на Bash и rclone
Обёртка только для копирования с ограничениями размера пакетов, резервами в локальном хранилище и месте назначения, полной побайтовой проверкой, контрольными точками, настройками повторных попыток и демонстрационным режимом без доступа к сети.
fileark-cloud-transfer.sh · Bash 4+ · rclone · jq · лицензия MIT

Скачать лицензию MIT
Уведомление о разрешении, относящееся к обоим скриптам FileArk для переноса вручную.
LICENSE-fileark-cloud-transfer.txt · MIT · обычный текст

Запустите демонстрацию без подключения к сети

Терминал со скриптом FileArk для облачной передачи на Bash и rclone, запущенным в демонстрационном режиме
Демонстрация показывает, как один пакет ограниченного размера проходит обе границы проверки. Она не проверяет конфигурацию rclone, не обращается к облаку и не записывает данные в удалённое хранилище.

Демонстрационный режим можно безопасно запускать до установки rclone или jq, поскольку после разбора аргументов программа завершает работу до проверки зависимостей. В выводе перечисляются запрещённые деструктивные операции, показываются оба резерва ёмкости, а в конце указывается количество удалений из источника.

Проверьте загруженный файл и выполните базовый тест
chmod +x fileark-cloud-transfer.sh
bash -n fileark-cloud-transfer.sh
./fileark-cloud-transfer.sh --demo
./fileark-cloud-transfer.sh --help

Установите и настройте необходимые зависимости

Установите актуальную версию rclone по официальной инструкции, а jq — с помощью менеджера пакетов вашей операционной системы. Требуется Bash 4 или более поздней версии, поскольку скрипт-обёртка использует строгую обработку ошибок и современные условные выражения.

Запустите rclone config и создайте два удалённых хранилища с разными именами, например onedrive: и gdrive:. Если правила или ограничения частоты запросов требуют отдельных приложений OAuth, укажите собственные идентификатор и секрет клиента провайдера. rclone хранит токены OAuth в своём файле конфигурации: защитите этот файл строгими правами доступа и никогда не распространяйте его вместе со скриптом.

Перед запуском обёртки проверьте каждое удалённое хранилище с помощью команды получения списка только для чтения и команды проверки квоты. Если в область переноса входит только часть дерева каталогов, используйте пути наподобие onedrive:Department/Archive.

Настройка и проверка обоих удалённых хранилищ
rclone version
rclone config
rclone lsd onedrive:
rclone lsd gdrive:
rclone about onedrive: --json | jq
rclone about gdrive: --json | jq

Зафиксируйте детерминированную опись до начала передачи данных

Обёртка рекурсивно запускает rclone lsf с явно заданным разделителем-табуляцией и форматом sp, получая размер, за которым следует путь. Она проверяет, что каждый размер является числом, а каждый путь — относительным, после чего исключает пути, уже присутствующие в проверенной контрольной точке.

Версия на Bash отклоняет имена файлов, содержащие символы табуляции, возврата каретки или перевода строки, поскольку списки --files-from-raw с разделением по строкам не позволяют представить такие имена однозначно. При наличии таких имён используйте версию на Python или специально разработанный формат описи.

Контрольная точка на основе путей намеренно сделана простой и доступной для проверки. Она предполагает, что пути в источнике остаются неизменными во время выполнения. По возможности запретите запись в источник, а если ожидаются параллельные изменения — повторно создайте опись и согласуйте различия.

Базовая команда инвентаризации, используемая обёрткой
rclone lsf "$SOURCE" \
  --recursive \
  --files-only \
  --format "sp" \
  --separator 
    
  

\t' > "$inventory"

Остановите обработку до того, как пакет израсходует резерв

Количество свободных байтов в локальном хранилище определяется командой df для файловой системы промежуточного каталога. Количество свободных байтов в месте назначения берётся из rclone about --json: скрипт использует значение free, если оно предоставлено, а иначе вычитает used из total. До начала работы он проверяет общий объём ожидающих передачи данных, а перед каждым пакетом повторно проверяет доступную ёмкость локального хранилища и места назначения.

Некоторые провайдеры или типы учётных записей не сообщают через rclone конечную квоту. Скрипт-обёртка выводит предупреждение об этом ограничении и продолжает работу в пределах ограничений, применяемых провайдером. Считайте это основанием для мониторинга, а не подтверждением того, что места достаточно.

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

Проверьте обе стороны локального промежуточного хранилища

Каждый пакет проходит два независимых этапа. Сначала rclone копирует выбранные пути источника в локальное промежуточное хранилище с параметром --ignore-existing, затем check --download считывает обе стороны и сравнивает фактическое содержимое. После этого rclone копирует эти пути из промежуточного хранилища в место назначения и повторяет такую же полную побайтовую проверку.

Параметр --ignore-existing делает возобновление прерванных запусков недеструктивным: существующий объект не перезаписывается. Прежде чем путь будет добавлен в контрольную точку, он всё равно должен успешно пройти проверку. Если существующий объект в месте назначения отличается, rclone check завершается с ошибкой, а строгая обработка ошибок Bash останавливает выполнение.

Использование --download замедляет процесс и расходует исходящий трафик или операции чтения у провайдера, но позволяет не полагаться исключительно на наличие общего алгоритма хеширования у двух провайдеров. Команда не изменяет данные ни на одной из сторон.

Два этапа копирования и проверки
rclone copy "$SOURCE" "$STAGING_DIR" \
  --files-from-raw "$batch_list" \
  --ignore-existing --retries 6 --low-level-retries 20

rclone check "$SOURCE" "$STAGING_DIR" \
  --files-from-raw "$batch_list" --one-way --download

rclone copy "$STAGING_DIR" "$DESTINATION_ROOT" \
  --files-from-raw "$batch_list" \
  --ignore-existing --retries 6 --low-level-retries 20

rclone check "$STAGING_DIR" "$DESTINATION_ROOT" \
  --files-from-raw "$batch_list" --one-way --download

Выполните перенос из OneDrive в Google Drive с ограниченным промежуточным хранилищем

В примере 15 GiB локального диска остаются в резерве, в Google Drive сохраняется 10 GiB свободного места, обычный пакет ограничивается 8 GiB или 200 файлами и используются четыре параллельные передачи. Данные в месте назначения записываются в новую папку с датой.

Сначала используйте --dry-run. Этот режим выполняет инвентаризацию источника и предварительную проверку квоты назначения без скачивания и загрузки файлов. Скрипт-обёртка выводит общий объём ожидающих переноса данных в байтах. Перед обработкой первого реального пакета его следует сверить с согласованным объёмом миграции.

Выполните предварительную проверку, затем обработайте тот же объём данных
./fileark-cloud-transfer.sh \
  --source onedrive: \
  --destination gdrive: \
  --destination-folder "OneDrive archive 2026-07-25" \
  --staging-dir /srv/fileark-staging \
  --state-file ./onedrive-to-google-verified.txt \
  --batch-gib 8 \
  --batch-files 200 \
  --local-reserve-gib 15 \
  --destination-reserve-gib 10 \
  --transfers 4 \
  --checkers 8 \
  --dry-run

# Remove only --dry-run after reviewing the preflight.

Измените направление, не используя прежнее состояние

Обёртка не зависит от провайдера, поскольку за адаптеры удалённых хранилищ отвечает rclone. Поменяйте местами аргументы удалённых хранилищ, чтобы скопировать данные из Google Drive в OneDrive, и укажите для этого запуска новую папку назначения, путь промежуточного хранения и файл контрольных точек.

Для файлов собственных форматов Google — Документов, Таблиц, Презентаций и других виртуальных форматов — необходимо настроить экспорт в rclone и тщательно проверить результат. На тестовом наборе проверьте расширения экспортированных файлов и особенности преобразования. Копирование с помощью shell-скрипта не сохраняет историю совместной работы Google, ярлыки, разрешения и метаданные, специфичные для Microsoft.

Из Google Drive в OneDrive
./fileark-cloud-transfer.sh \
  --source gdrive: \
  --destination onedrive: \
  --destination-folder "Google archive 2026-07-25" \
  --staging-dir /srv/google-staging \
  --state-file ./google-to-onedrive-verified.txt \
  --batch-gib 8 \
  --local-reserve-gib 15

Создавайте контрольную точку только после проверки места назначения

После успешного завершения проверки места назначения обёртка добавляет каждый относительный путь в текстовый файл контрольных точек. Затем она удаляет этот файл из локального промежуточного хранилища и удаляет пустые локальные каталоги. Удалённое хранилище-источник остаётся неизменным.

Во время выполнения данные в контрольную точку только дописываются, и её легко проверять стандартными инструментами. Сохраните её вместе с командной строкой, версией rclone, отпечатком конфигурации, описью, журналами, временными метками и примечаниями о приёмке. Не редактируйте её, чтобы скрыть ошибку, если файл в месте назначения не был независимо проверен.

Контрольная точка, содержащая только путь, не позволяет обнаружить исходный объект, содержимое которого изменилось без изменения пути. Для изменяемых наборов данных приостановите запись, отдельно сохраните идентификаторы провайдера и метаданные об изменениях либо используйте более строгие контрольные точки по идентификатору и размеру из версии на Python. Для регулируемых или совместных миграций используйте управляемый процесс с явным контролем изменений.

Считайте пакет необработанным при любом ненулевом коде завершения

  • В строгом режиме работа завершается при ошибке команды или конвейера, а также при обращении к неопределённой переменной; временный каталог описи удаляется автоматически.
  • rclone повторяет передачу при временных сбоях, но постоянные ошибки прав доступа, квоты, сети, конфликты или нарушения целостности останавливают обработку пакета.
  • Файлы в промежуточном хранилище, не добавленные в контрольную точку, остаются доступными для проверки, а при идентичном повторном запуске перед проверкой их байтов применяется --ignore-existing.
  • Отличающийся файл в месте назначения никогда не перезаписывается. Устраните конфликт или выберите чистый корневой каталог назначения.
  • Не заменяйте неудавшееся копирование командами rclone sync или move. У этих команд другие правила удаления.
  • Храните журналы и контрольную точку до завершения ручной приёмки данных в месте назначения.

Защитите хост, который становится уровнем передачи данных

На промежуточном хосте временно хранятся доступные для чтения копии исходных данных и токены обновления OAuth. Используйте полное шифрование диска, строгие разрешения для файлов, отдельную учётную запись операционной системы, своевременно обновляемые зависимости, контролируемый административный доступ и правила создания зашифрованных резервных копий, исключающие непреднамеренное сохранение содержимого промежуточного хранилища.

Не передавайте секреты через командную строку: их могут раскрыть списки процессов и история командной оболочки. Защищённая конфигурация rclone может скрывать хранящиеся токены, но не заменяет безопасность хоста. После приёмки миграции удалите данные токенов и остатки промежуточных файлов в соответствии с вашей политикой хранения.

Отслеживайте журналы аудита провайдеров, исходящий сетевой трафик, состояние диска, наличие inode, состояние процесса и вывод rclone. Оставленный открытым терминал не заменяет контроль процесса: используйте одобренный диспетчер служб или терминальный мультиплексор и обеспечьте долговременное хранение журналов.

Завершайте миграцию на основании подтверждений, а не успешного статуса команды

  • Сохраните в архиве зафиксированную опись, точную команду, контрольную сумму скрипта, версию rclone, отпечаток конфигурации удалённых хранилищ и проверенную контрольную точку.
  • Сверяйте количество файлов и известный объём в байтах по каждой папке, а не только по диску в целом.
  • Откройте сформированную с учётом рисков выборку больших, малых, старых, новых, архивных и преобразованных документов, а также документов с символами Unicode и глубоко вложенных документов.
  • Проверьте доступ к месту назначения из-под репрезентативных учётных записей пользователей и отдельно заново настройте необходимый общий доступ.
  • Проверьте пропущенные пакеты, ярлыки, ссылки, документы в собственных форматах провайдеров, конфликты и предупреждения провайдеров.
  • В течение некоторого времени сохраняйте исходные данные и получите явное подтверждение владельца перед любым последующим решением об их хранении или удалении.

Часто задаваемые вопросы

Почему Bash-скрипт использует rclone copy, а не sync?

Копирование не удаляет объекты из источника или отсутствующие в источнике объекты из места назначения. У синхронизации другие правила согласования и удаления, поэтому она намеренно не входит в этот процесс.

Изменяет ли rclone check --download данные в каком-либо из облаков?

Нет. Команда считывает и сравнивает содержимое файлов. Скрипт использует её после каждого этапа копирования, поэтому путь сохраняется в контрольной точке только после того, как данные в месте назначения побайтово совпадут с данными в промежуточном хранилище.

Что произойдёт, если в месте назначения уже есть файл?

При копировании используется --ignore-existing, после чего выполняется побайтовая проверка всего содержимого. Идентичный объект пройдёт проверку, а отличающийся объект приведёт к ошибке. Скрипт никогда не перезаписывает конфликтующий объект.

Может ли скрипт обрабатывать файлы, размер которых превышает размер одного пакета?

Да. Один файл слишком большого размера будет выделен в отдельный пакет. В файловой системе промежуточного хранилища должно быть достаточно места для этого файла и настроенного локального резерва.

Переносятся ли разрешения, версии и облачные данные для совместной работы?

Нет. Через rclone копируются содержимое файлов и пути. Для переноса настроек управления доступом, версий, меток, комментариев, ярлыков, ссылок и правил хранения, а также поведения, специфичного для провайдера, необходимы отдельное планирование и проверка.

Официальные источники, использованные в этом руководстве

Читать руководство