Получить `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-ключ
  • Rsync over ssh tunnel - использование сервера шлюза
  • Короткий путь к scp с использованием одного и того же файла / источника в исходном и целевом
  • Я могу ssh на удаленную машину, но я не могу использовать scp для копирования локальных файлов на удаленную машину
  • Запись функции bash, которая работает в списке имен файлов
  • Выборочно копировать из коллекции удаленных каталогов
  • Перенос миллионов файлов с одного сервера на другой
  • Переместить файл в домашний каталог другого пользователя (без sudo)?
  • scp не может загружать / скачивать файлы, даже если ssh работает
  • SCP с одного сервера на другой без запроса пароля
  • Linux и Unix - лучшая ОС в мире.