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

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

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

scp -prq server1:dir1 server2:dir2

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

Проблема возникает, когда dir2 уже существует на сервере server2 (ПРИМЕЧАНИЕ: у меня нет возможности узнать это заранее или выполнить удаление dir2 на сервере server2 заранее) — происходит следующее: я получаю копию 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, иногда просто свежий взгляд может помочь указать путь.

решение1

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

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

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

решение2

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

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

Это также может привести к пропуску скрытых файлов . из-за расширения * glob (без некоторыхсложная работа, специфичная для оболочки)

Вы можете подойти к этому по-разному с помощью sshи tar.

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

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

решение3

сначала очистите его с помощью ssh, а затем заново создайте с помощью scp. т. е. в файле скрипта...

ssh -i ~/.ssh/[private_key] user@server2 "rm -rf dir2; выход;"

scp -prq сервер1:каталог1 сервер2:каталог2

решение4

Я бился головой об эту же самую проблему, и в итоге пришёл к следующему выводу: если dir2 — это [STUFF]/parent/child2, я переименовываю, копирую или связываю dir1 (в зависимости от ситуации) с dir1_child2 на server1, чтобы его последний компонент пути также был child2, а затем просто выполняю

scp -prq server1:dir1_child2 server2:[STUFF]/parent

Это выполняется независимо от того, присутствует ли child2 в родительском каталоге dir2, и успешно заменяет dir2, если он присутствует.

Связанный контент