Слэши и команда rsync
Я пытаюсь сделать что-то в соответствии с тем, что задается в этом вопросе: RSync: Как синхронизировать в обоих направлениях?
Однако, что я не могу понять, нужно ли добавлять косые черты в конец пути к файлу. В основном я пытаюсь создать команду alias, которая синхронизирует содержимое двух каталогов, которые идут с тем же именем, но находятся на двух разных серверах. Я не хочу, чтобы один каталог был скопирован в другой (который, как мне известно, является возможностью в зависимости от того, как выполняются слэши в конце).
В настоящее время у меня есть:
alias syncDirectories1 = 'rsync -tvur [email protected]:/Users/me/directory/ /Users/me/directory/'
alias syncDirectories2 = 'rsync -tvur /Users/me/directory/ [email protected]:/Users/me/directory/'
Для чего я пытаюсь выполнить, должны ли быть косые черты в конце обоих путей файла?
Заранее спасибо за помощь.
Ответы
Ответ 1
Он описан в man-странице rsync(1)
.
Конечная косая черта в источнике изменяет это поведение, чтобы избежать создания дополнительного уровня каталога в пункте назначения. Вы можете думать о trailing/on source, что означает "скопировать содержимое этого каталога", а не "скопировать каталог по имени", но в обоих случаях атрибуты содержащего каталога переносятся в содержащийся каталог адресата. Другими словами, каждая из последующих мер, команды копируют файлы таким же образом, включая их настройку атрибутов /dest/foo:
rsync -av /src/foo /dest
rsync -av /src/foo/ /dest/foo
Что касается места назначения, я не думаю, что это имеет серьезные последствия. Существует разница, если источник - это файл, а адресата не существует - команда
rsync SRC DEST
сделает копию SRC
под названием DEST
, тогда как
rsync SRC DEST/
создаст каталог DEST
и скопирует в него файл SRC
.
Ответ 2
сохранить косые черты в источнике и удалить их из адресата.
Вот так:
alias syncDirectories1 = 'rsync -tvur [email protected]:/Users/me/directory/ /Users/me/directory'
alias syncDirectories2 = 'rsync -tvur /Users/me/directory/ [email protected]:/Users/me/directory'
Ответ 3
У меня были отличные результаты от принятого ответа на Ubuntu 17.04. Похоже, что пункт назначения/не имеет эффекта. Я сделал следующие четыре команды:
rsync -av src nslash # No slashes on either src or dest
rsync -av src dslash/ # Slash on Dest only
rsync -av src/ sslash # Slash on src only
rsync -av src/ sdslash/ # Slash on both src and dest
Выводы:
- если на src есть /, то содержимое src будет скопировано только в dest, независимо от того, есть ли у dest косая черта или нет.
- без косой черты в src, тогда src и его содержимое будут скопированы в dest.
- Удары по Dest не имеют никакого эффекта.
Ответ 4
Я проверил это с rsync 3.1.3 на Arch Linux, результаты ниже:
1. rsync -avPzu test [email protected]:/home/login/test "test" directory is copied inside of existing "test" on remote (structure is then test/test/...)
2. rsync -avPzu test [email protected]:/home/login/test/ same as above
3. rsync -avPzu test/ [email protected]:/home/login/test content of "test" directory is synchronized with the remote "test" directory
4. rsync -avPzu test/ [email protected]:/home/login/test/ same as above
5. rsync -avPzu test [email protected]:/home/login/ same as above
6. rsync -avPzu test [email protected]:/home/login same as above
Методы 3-6 являются правильными в этом случае, в отличие от принятого ответа.