Сделать scp всегда перезаписать или создать каталог

26

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

scp -prq server1:dir1 server2:dir2

Это прекрасно работает, если dir2 не существует на server2, он создает новый каталог с именем dir2, который содержит все, начиная с dir1 на server1.

Проблема возникает, когда dir2 уже существует на сервере server2 (ПРИМЕЧАНИЕ. У меня нет возможности узнать об этом заранее или выполнить удаление на dir2 на server2 заранее) - в результате я получаю копию dir1, называемую dir1, в dir2.

Я уверен, что есть кое-что основное, что я пропускаю, но я просто не могу решить это.

Любая помощь высоко ценится!

С Уважением,

Giles

Хорошо, у меня менее 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, иногда просто получить новую точку зрения может помочь указать путь.

Giles
источник
у вас есть доступ к scp, но нет ssh?
Мэтт
Это правильно
Джайлс
Единственная проблема заключается в том, что вы попробуете вторую копию при любом сбое, которое не обязательно dir2 не существует Может быть, если вы можете придумать тест, который практически ничего не делает (скажем, скопировать пустой каталог). Затем на основе выходных данных запустите scp1 или scp2
Matt
Хороший вопрос, я буду иметь это в виду, двигаясь вперед, и делаю репост, если я что-нибудь придумаю.
Джайлс
Ты можешь sftp? затем проверьте вывод cd dir2.
Мэтт

Ответы:

34

Используйте этот «точечный» синтаксис:

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

Это копирует содержимое этого каталога, а не сам каталог. И я полагаю, что это более портативно, чем *глобализация.

chronospoon
источник
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 - )"

Но это означает, что трафик идет через вашу локальную машину.

Matt
источник
scp -prq сервер1: dir1 / * сервер2: dir2 /
Джайлс
@ Джайлз, ты говоришь, что это работает?
Мэтт
1
Странно, я отредактировал это, но оно потеряно - нет, это не работает, если dir не существует, то scp выдает ошибку. Также у меня нет ssh, доступного в данном конкретном случае (проблема с правами пользователя). Это дает мне представление, хотя, поскольку я делаю это в сценарии, я могу попробовать описанное выше, зафиксировать любую ошибку и, в случае ошибки, попробовать базовую версию из моего первого поста. Спасибо за помощь @mindthemonkey
Джайлс
1
Это ошибка «Каталог», когда каталог назначения не существует для меня.
Мэтт
1
Да, я тоже, странная ошибка, учитывая, что каталог не существует.
Джайлс