Подойдет ли rsync для моего проекта?
Мне нужно:
- скопировать файлы из исходной папки в целевую через SSH,
- убедиться, что все файлы скопированы,
- удалить исходные файлы после копирования.
- если у меня есть конфликт имен, мне нужно переименовать файлы.
Похоже, я могу использовать опцию: --remove-source-files (для удаления исходных файлов).
Но как rsync управляет конфликтами, можно ли установить правила?
Вариант использования в моем проекте:
Я запускаю научные вычисления на сервере A, и результаты вставляются в папку "process", для каждого вычисления у меня есть репозиторий вроде этого: /process/calc1.
Теперь я хотел бы перенести репозиторий "/calc1" на сервер B (я получаю /process/calc1), и удалить "calc1" с сервера A.
...Во время другого вычисления я получаю "/process/calc2" на сервере A, идея также состоит в том, чтобы переместить "calc2" в каталог "/process/" на сервере B, тогда у меня теперь на сервере B:
- /process/calc1
- /process/calc2
(и /process/ на сервере A пуст).
Как rsync будет управлять конфликтом (на сервере B), если у меня есть другая папка, например «/process/calc1» на сервере A после нового вычисления (если «/process/calc1» уже существует на сервере B)?
Можно ли добавить правила с помощью rsync и переименовать "/process/calc1" в "process/calc1R2" на сервере B? И так далее (например:calc1R3)?
Спасибо.
решение1
Если вы действительно хотите использовать rsync, похоже, вам понадобится некая комбинация --backup, --backup-dir и --suffix. Самое близкое, что вы могли бы получить, это, как мне кажется, что-то вроде этого
rsync -abv --suffix R1 --remove-source-files src/ dst/
Это будет близко к тому, что вы хотите, но не переименует файлы именно так, как вам нужно. Параметр --suffix добавляет текст в конец существующего файла, но делает это только для первого конфликта. Если вы запустите его снова, он просто перезапишет вашу первую резервную копию. Вам придется менять это значение суффикса каждый раз при запуске команды, что сработает, если вы используете что-то с временной меткой, например, так:
rsync -abv --suffix `date +%Y%m%d%k%M%S` --remove-source-files src/ dst/
Я не уверен, что это излишне, но это должно удовлетворить ваши требования.
решение2
Как следует из названия, rsync используется для синхронизации файлов. Когда "синхронизировано", это означает, что файлы на источнике и месте назначения одинаковы. Это не похоже на то, что вы хотите сделать.
Похоже, вы просто хотите переместить некоторые файлы. Вам не нужно использовать rsync для этого. Похоже, вы используете Linux или BSD. Вы можете использовать mv -n поверх ssh. Параметр -n не перезаписывает существующие файлы. Это не 100% автоматическое действие. Однако я не вижу, как файл может уже существовать в вашем случае. Файлы будут скопированы из источника в место назначения, а затем удалены из источника. Вы хотите снова выполнить те же вычисления? Поэтому у вас получатся файлы с тем же именем? Я бы предложил добавить номер запуска или пакета к имени папки. Вам бы в любом случае хотелось, чтобы это было понятно. У вас есть какой-либо контроль над тем, как называется папка? Есть еще подробности? Я бы рекомендовал поместить команды в скрипт bash или что-то подобное.
решение3
Для SSH, вкратце, используйте это:
Доступ через удаленную оболочку:
Извлечение: rsync [ПАРАМЕТР...] [ПОЛЬЗОВАТЕЛЬ@]ХОСТ:ИСТОЧНИК... [НАЗНАЧЕНИЕ]
Push: rsync [ПАРАМЕТР...] ИСТОЧНИК... [ПОЛЬЗОВАТЕЛЬ@]ХОСТ:НАЗНАЧЕНИЕ
Все это объяснено в rsync(1).
Что касается написания скрипта для cronjob, чтобы автоматически выполнять rsync через ssh без запроса пароля, рассмотрите также ssh-agent(1).