
Я использую 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, если он присутствует.