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


573

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

Ответы:


937

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

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

Примечание: это создает sourcedirectoryвнутреннюю часть, /pathпоэтому файлы будут в/path/sourcedirectory


9
Однако имейте в виду, что это не сохранит символические ссылки.
CpnCrunch

12
Обратите внимание, что -pr(параметры в обратном порядке) не будут копировать папки, а скорее их содержимое в целевой каталог (очевидно, порядок параметров имеет значение).
pms

172

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

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

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

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

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

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


1
Я согласен, rsyncэто более эффективно. В настоящее время он scpне выполняет копирование между удаленными хостами (по крайней мере, без запуска клиента rsync на одном из них).
Седрик Найт

1
-av: v - для многословного, a - для архива и является ярлыком для -rlptgoD, который подразумевает рекурсивное сохранение прав владельца и дат. Если вы хотите только рекурсивное использование-r
pdem


11

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

scp -r

Что я путаю с опцией обычного локального рекурсивного копирования '-R' (верхний регистр)

cp -R

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

6

Лучший способ - использовать 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: удалить файлы в месте назначения, которых больше нет в источнике

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

4

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

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

В итоге я сделал:

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

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


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

2

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

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/logat domain.comв ~/destination/logвашу систему:

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

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


1

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

Пример:

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

0

Вы можете использовать опцию -r с командой scp для рекурсивного копирования каталогов в любой системе. Если вам нужно что-то еще, обратитесь к руководству по команде scp . Опция -r обозначает рекурсивную операцию в большинстве команд Linux.


Хотя это и правда, этот -rвариант уже был предложен несколько лет назад и является приемлемым ответом.
RalfFriedl

-3

Другой (вероятно, лучше для многократного использования) вариант - использовать NFS - проверить nfs-kernel-server и как настроить общие ресурсы NFS.


2
Это полная чушь. Есть бесконечные случаи, когда вы бы использовали, scpно NFS не вариант.
Свен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.