Чи можна сканувати копіювати каталоги рекурсивно?


572

В даний час я можу скопіювати лише один .tarфайл. Але як я можу копіювати каталоги рекурсивно scp?

Відповіді:


935

Так, використовуйте -r:

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

Примітка. Це створює sourcedirectoryвнутрішню частину, /pathтаким чином файли будуть знаходитись/path/sourcedirectory


9
Однак майте на увазі, що це не збереже посилання.
CpnCrunch

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

171

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

Якщо ви збираєтесь скопіювати щось на віддалену машину не один раз, використовуйте rsync. Насправді це добре використовувати rsyncщоразу, оскільки в ньому є більше елементів керування для таких речей, як копіювання дозволів і прав власності на файли та виключення певних файлів чи каталогів. Загалом:

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

синхронізує локальний каталог із віддаленим каталогом. Якщо запустити його вдруге, і вміст локальної каталогі не змінився, дані не передаватимуться - набагато ефективніше, ніж scpкожен раз виконувати та копіювати все.

Також rsyncдозволяє відновити після перерваних переказів дуже легко, на відміну від scp.

Нарешті, сучасні версії rsyncза замовчуванням працюють над ssh, тому, якщо scpвона вже працює, rsyncце в значній мірі повинно бути заміною.


1
Я згоден, rsyncце більш ефективно. Одне, що він зараз не scpробить, це дозволити копіювання між віддаленими хостами (принаймні, без запуску клієнта rsync на одному з них).
Седрік Лицар

1
-av: v - для багатослівного, для архіву і - це ярлик до -rlptgoD, що передбачає рекурсивні, збереження дат і посилань власника прав. Якщо ви хочете лише використовувати рекурсивне використання-r
pdem


10

Рекурсивний варіант копіювання '-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навряд чи знадобляться. І вибір команди, яка використовується для підключення до віддаленого хоста, насправді не пов'язаний з рекурсивним копіюванням.
kasperd

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оскільки файл є архівом gzipped tar (оскільки -zпрапор використовується).
anthonybell

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/logна 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варіант уже запропонований років тому і є прийнятою відповіддю.
РальфФрідль

-3

Інший (швидше за все, кращий для повторного використання) варіант - використовувати NFS - перевірити nfs-kernel-сервер та як налаштувати NFS-спільні папки.


2
Це повна дурниця. Є нескінченні випадки, коли ви користуєтесь, scpале NFS - це не варіант.
Свен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.