Я использую 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, иногда просто свежая точка зрения может помочь указать путь.
Используйте этот синтаксис с точкой:
scp -prq server1:dir1/. server2:dir2/
Это копирует содержимое этого каталога, а не самого каталога. И я считаю, что он более портативный, чем *
глобус.
Обычно для управления созданием каталогов вам нужно использовать завершающий /
чтобы обозначить полный путь, но я думаю, что тогда не удастся создать каталог, если он не существует:
scp -prq server1:dir1/* server2:dir2/
Это также может пропустить скрытое. файлы из-за расширения * glob (без некоторых сложная работа, специфичная для оболочки)
Вы можете подойти к этому иначе с ssh
и tar
.
ssh server1 "cd dir1 && tar -cf - ." | ssh server2 "( mkdir -p dir2; cd dir2 && tar -xf - )"
Но это означает, что трафик идет через ваш локальный компьютер.
сначала очистите его с помощью ssh, а затем воссоздайте с помощью scp. то есть в файле сценария ...
ssh -i ~ / .ssh / [private_key] user @ server2 "rm -rf dir2; exit;"
scp -prq server1: dir1 server2: dir2