Вопрос: Может ли scp копировать каталоги рекурсивно?


В настоящее время я могу только скопировать .tar файл. Но как я могу скопировать каталоги рекурсивно с помощью scp?


496
2018-04-29 04:24


Источник




Ответы:


Да, используйте -r:

scp -rp sourcedirectory user@dest:/path
  • -r означает рекурсивный
  • -p сохраняет время модификации, время доступа и режимы из исходного файла.

Примечание. Это создает sourcedirectory внутри /path таким образом, файлы будут /path/sourcedirectory


802
2018-04-29 04:28



Однако имейте в виду, что это не будет сохранять символические ссылки. - CpnCrunch
Обратите внимание, что -pr (опции в обратном порядке) не будут копировать папки, а скорее их содержимое в целевой каталог (по-видимому, порядок вариантов имеет значение). - pms
По какой-то причине /path по-видимому, относительно users $HOME - как я могу сделать это абсолютным, не будучи root@? - Jonathan
Да, SCP, как никогда, не ставит файлы там, где я хочу. Часто, когда вы пытаетесь заменить каталог, я каким-то образом заканчиваю другим каталогом внутри него с тем же именем. Я очень осторожен с этим. - sudo


Хотя предыдущие ответы являются технически правильными, вы также должны рассмотреть возможность использования rsync вместо. rsync сравнивает данные на отправляющей и принимающей сторонах с механизмом разности, поэтому ему не нужно повторно отправлять данные, которые уже были отправлены ранее.

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

$ rsync -av /local/dir/ server:/remote/dir/

синхронизирует локальный каталог с удаленным каталогом. Если вы запустите его второй раз, а содержимое локального каталога не изменилось, данные не будут переданы - гораздо эффективнее, чем запуск scp и копировать все каждый раз.

Также, rsync позволяет очень легко восстанавливаться из прерванных передач, в отличие от scp,

Наконец, современные версии rsync по умолчанию запускается через ssh, поэтому if scp уже работает, rsync должен в значительной степени быть заменой замены.


143
2018-04-29 05:11



«данные не будут переданы», за исключением, конечно, данных, необходимых для определения того, что было или не изменилось. - thsutton
Ха, да, я немного замалчивал это. Мы не говорим о квантовой запутанности здесь. - Phil Hollenback
это так печально, что osx, win7 и даже не ubuntu пока что-то вроде rsync для своего графического интерфейса. - cregox
dmourati Я ответил на его вопрос. Я сказал ему, что это лучший способ сделать это. - Phil Hollenback
@raphnguyen: no, удаление файлов из локального каталога не удалит их из удаленного каталога. Вы можете включить это поведение с помощью --delete rsync. - Phil Hollenback


Это то, что -r опция для. :)

См. scp man page для получения дополнительной информации, если необходимо.


28
2018-04-29 04:27





Рекурсивный вариант копирования '-r' (нижний регистр)

scp -r

Что я путаю с регулярным локальным рекурсивным вариантом копирования «-R» (верхний регистр)

cp -R

7
2017-09-11 17:53



Я просто хотел указать на разницу между cp и scp как -r и -R не то же самое. unix.stackexchange.com/questions/18712/... - Tarun


Лучший способ - использовать rsync через SSH

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

Мои варианты избранного: -Pazvessh -delete:

  • -a: режим архива (включая множество стандартных параметров по умолчанию, включая сохранение символических ссылок)
  • -z: сжать
  • -v: verbose: показать файлы
  • -P: показать прогессию как файлы, сделанные / оставшиеся файлы
  • -e ssh: выполнить rsync в протоколе ssh
  • --delete: удалить файлы в месте назначения, которые больше не находятся в источнике

4
2017-11-05 18:33



Все версии rsync которые я использовал, будет использовать ssh по умолчанию, так -essh вряд ли понадобится. И выбор команды, используемой для подключения к удаленному хосту, действительно не связан с копированием рекурсивно. - kasperd


После поиска флага рекурсивной копии и успешного использования этого сообщения, я хотел бы опубликовать только предложение.

Если дело в том, что вы копируете (рекурсивно) каталог. Возможно, если файлы будут отправлены сжатыми, вы можете сэкономить время в передаче

В конце концов я сделал следующее:

local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz

Надеюсь это поможет


3
2018-06-06 18:00



расширение файла должно быть .tar.gz или .tgz так как файл представляет собой архив с tar-архивами (с -z используется флаг). - anthonybell


Вы можете рекурсивно скопировать каталог в сжатый архив с помощью этой простой команды:

ssh -p 22 user@address-to-copy-from.com  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

Например, чтобы скопировать содержимое /var/log из domain.com в ~/logs.tgz ты бежишь:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' > ~/logs.tgz

Вы также можете извлекать файлы в целевой системе, используя каналы. Эта команда будет копировать содержимое /var/log в domain.com в ~/destination/log в вашей системе:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

Хотя для зеркалирования каталога вы, вероятно, должны использовать rsync...


1
2018-01-06 07:20





Если вы предпочитаете передавать пароль пользователя в качестве параметра, а не вводить его в интерактивном режиме, вы можете использовать sshpass(sudo apt-get install -y sshpass).

Пример:

sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@122.10.12.123:/dest/folder

0
2018-01-06 06:49