Слэши и команда 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 являются правильными в этом случае, в отличие от принятого ответа.