Получить `scp path /` вести себя как `rsync path /`

У меня есть локальная файловая структура:

/tmp/24 /dir1 /file1 /file2 /dir2 /file3 /file4 

и я хочу загрузить его на удаленный компьютер. Когда я использую

 rsync /tmp/24 host:/target 

он создает его внутри target каталога на удаленном хосте ( /target/24/dir1/file1 , …). Но когда я использую его так

 rsync /tmp/24/ host:/target 

он делает то, что я хочу, и это должно быть создано так: /target/dir1/file1 . Однако scp делает первое, если целевая папка уже существует и вторая, когда она не зависит от пути, заканчивается / или нет. Как заставить scp заставить себя вести себя как rsync во втором примере?

2 Solutions collect form web for “Получить `scp path /` вести себя как `rsync path /`”

Конечный '/' в имени исходного каталога представляет собой тонкость rsync. Обратите внимание на это.

Rsync

Конечная косая черта в источнике эффективно означает «скопировать содержимое этого каталога, а не самого каталога». Без конечной косой черты это означает «скопировать каталог».

Поэтому rsync -a tmp/24/ host:/target будет копировать содержимое «/ tmp / 24 /» в «host: / target / …».

Но rsync -a tmp/24 host:/target скопирует каталог «/ tmp / 24 /» (и его содержимое) в «host: / target / 24 / …».

Не имеет значения, если «host: / target /» еще не существует; он будет создан, если необходимо, и результаты будут одинаковыми в любом случае.

(Трейлинг слэш в пункте назначения не имеет значения.)

 ┌─────────────────────────┬───────────────┬───────────────────────┐ │ rsync │ target exists │ target does not exist │ ├─────────────────────────┼───────────────┼───────────────────────┤ │ rsync -a tmp/24 target │ target/24/… │ target/24/… │ ├─────────────────────────┼───────────────┼───────────────────────┤ │ rsync -a tmp/24/ target │ target/… │ target/… │ └─────────────────────────┴───────────────┴───────────────────────┘ 

УПП

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

 ┌───────────────────────┬───────────────┬───────────────────────┐ │ scp │ target exists │ target does not exist │ ├───────────────────────┼───────────────┼───────────────────────┤ │ scp -r tmp/24 target │ target/24/… │ target/… │ ├───────────────────────┼───────────────┼───────────────────────┤ │ scp -r tmp/24/ target │ target/24/… │ target/… │ └───────────────────────┴───────────────┴───────────────────────┘ 

Итак, вы правы, сначала нужно сначала сделать ssh host mkdir -p /target , а затем поведение будет таким же, как и для rsync.

Но почему бы просто не использовать rsync? Он делает гораздо больше, например, частичные передачи, прерванные передачи и сжатые данные.

 rsync -azu tmp/24 host:/target 

ср

И для полноты: на Mac конечный «/» дает вам семантику rsync, пока цель уже существует.

 ┌──────────────────────┬───────────────┬───────────────────────┐ │ cp (Mac) │ target exists │ target does not exist │ ├──────────────────────┼───────────────┼───────────────────────┤ │ cp -a tmp/24 target │ target/24/… │ target/… │ ├──────────────────────┼───────────────┼───────────────────────┤ │ cp -a tmp/24/ target │ target/… │ target/… │ └──────────────────────┴───────────────┴───────────────────────┘ 

Под Linux косые черты вообще не имеют значения, как и scp:

 ┌──────────────────────┬───────────────┬───────────────────────┐ │ cp (Linux) │ target exists │ target does not exist │ ├──────────────────────┼───────────────┼───────────────────────┤ │ cp -a tmp/24 target │ target/24/… │ target/… │ ├──────────────────────┼───────────────┼───────────────────────┤ │ cp -a tmp/24/ target │ target/24/… │ target/… │ └──────────────────────┴───────────────┴───────────────────────┘ 

то же самое

Добавление … ditto (1) – это инструмент Mac OS для клонирования каталога. Он делает как можно точнее копию.

Шрезы не имеют значения. Является ли целевой каталог уже существующим, не имеет значения.

 ┌──────────────────────┬──────────┐ │ ditto tmp/24 target │ target/… │ └──────────────────────┴──────────┘ 

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

да, поэтому моя проблема может быть решена следующим образом:

 ssh host "mkdir -p /target" scp tmp/24/* host:/target 
  • Как указать, куда файлы переносятся на использование ssh
  • Потрясающее поведение счетчика SSH / SCP
  • scp (v4) копирование с удаленного на несколько локальных имен файлов
  • настроить SSH на Linux для входа в систему без пароля
  • «Permission denied, try again» при передаче файлов с помощью scp
  • scp alias для удаления двоеточий / специальных символов
  • scp и владелец файла
  • Как скопировать файлы с удаленного сервера unix в локальные окна?
  • Удаленный ПК, доступный с помощью ssh, scp / rsync, не работает (больше)
  • Почему scp не показывает истинную скорость загрузки?
  • Push / Pull файлы среди Unix-машин с закрытым ключом в Windows
  • Linux и Unix - лучшая ОС в мире.