Зробити scp завжди перезаписувати або створювати каталог


26

Я використовую scp для копіювання каталогу з одного віддаленого сервера в новий каталог (IE просто змінює ім'я) на інший віддалений сервер, наприклад:

scp -prq server1:dir1 server2:dir2

Це добре працює, якщо dir2 не існує на сервері2, він створює нову директорію під назвою dir2, яка містить усе, починаючи з dir1 на сервері1.

Проблема виникає, коли dir2 вже існує на сервері2 (ПРИМІТКА. Я не маю можливості це заздалегідь знати або робити видалення на dir2 на сервері2) - що трапляється, я отримую копію dir1, що називається dir1, в dir2.

Я впевнений, що я чогось основного мені не вистачає, але я просто не можу це зробити.

Будь-яка допомога дуже вдячна!

З повагою,

Джайлз

Гаразд, у мене менше 10 повторень, і я не можу змусити себе чекати 8 годин, тож ось що я отримав:

Ось сценарій, який працює для мене:

#!/bin/sh
echo "method 1"
scp -prq server1:dir1/* server2:dir2/ >/dev/null  2>&1

if [ "$?" -ne "0" ]; then
        echo "failed ... trying method 2"
        scp -prq server1:dir1 server2:dir2
fi

exit

Ще не впевнений, як це зробити в одній команді або навіть, якщо можливо.

Привіт @mindthemonkey, іноді просто отримання свіжої точки зору може допомогти вказувати шлях.


у вас є доступ scp, але не ssh?
Метт

Це правильно
Giles

Єдина проблема полягає в тому, що ви спробуєте другу копію при будь-якій помилці, яка необов'язково dir2 не існує. Можливо, якщо ви можете придумати тест, який практично нічого не робить (скажімо, скопіюйте порожній dir). Тоді на основі виходу або запустіть scp1 або scp2
Метт,

Хороший момент, я маю на увазі, що йти вперед і робити репост, якщо щось придумати.
Giles

Ви можете sftp? потім перевірте вихід a cd dir2.
Метт

Відповіді:


34

Використовуйте цей синтаксис "крапка":

scp -prq server1:dir1/. server2:dir2/

Це копіює вміст цього каталогу, а не сам каталог. І я вважаю, що це більш портативно, ніж *глобус.


2
-p ⇒ "Зберігає час модифікації, час доступу та режими у вихідному файлі." -r ⇒ "Рекурсивно копіюйте цілі каталоги." -q ⇒ "Вимкнення вимірювача прогресу." Джерело: computerhope.com/unix/scp.htm
kr85

1
Це дає мені помилку:scp: error: unexpected filename: .
Андрій Костер

1

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

scp -prq server1:dir1/* server2:dir2/

Це також може пропустити приховане. файли за рахунок розширення * glob (без якоїсь хитрої конкретної роботи оболонки )

Ви можете підходити до нього по-різному за допомогою sshта tar.

ssh server1 "cd dir1 && tar -cf - ." | ssh server2 "( mkdir -p dir2; cd dir2 && tar -xf - )"

Але це означає, що трафік проходить через вашу локальну машину.


scp -prq server1: dir1 / * server2: dir2 /
Giles

@Giles, ти кажеш, що це працює?
Метт

1
Як не дивно, я це відредагував, але він загубився - ні, це не працює, якщо режисура не існує, тоді scp видає помилку. Також у мене немає ssh в цьому конкретному випадку (питання з правами користувача). Це все ж дає мені уявлення, хоча я роблю це в сценарії, я можу спробувати вищесказане, виявити будь-яку помилку і, помиляючись, спробувати основну версію з мого першого повідомлення. Дякуємо за допомогу @mindthemonkey
Giles

1
Це помилка "Є каталог", коли для мене каталог призначення не існує.
Метт

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