Faça com que o scp sempre substitua ou crie um diretório

Faça com que o scp sempre substitua ou crie um diretório

Estou usando o scp para copiar um diretório de um servidor remoto para um novo diretório (ou seja, apenas alterando o nome) em outro servidor remoto como:

scp -prq server1:dir1 server2:dir2

Isso funciona bem se dir2 não existir no servidor2, ele cria um novo diretório chamado dir2 que contém tudo, desde dir1 no servidor1.

O problema surge quando o dir2 já existe no servidor2 (NOTA: não tenho como saber disso com antecedência ou de remover antecipadamente o dir2 no servidor2) - o que acontece é que recebo uma cópia do dir1, chamada dir1, no dir2.

Tenho certeza de que está faltando algo básico, mas simplesmente não consigo resolver.

Qualquer ajuda muito apreciada!

Cumprimentos,

Giles

Ok, tenho menos de 10 repetições e não posso esperar 8 horas, então aqui está o que consegui:

Aqui está um script que funciona para mim:

#!/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

Ainda não tenho certeza de como fazer isso em um único comando ou mesmo se possível.

Felicidades @mindthemonkey, às vezes apenas obter um novo ponto de vista pode ajudar a apontar o caminho.

Responder1

Use esta sintaxe de "ponto":

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

Isso copia o conteúdo desse diretório, em vez do próprio diretório. E acredito que seja mais portátil do que *globular.

Responder2

Normalmente, para controlar a criação de diretório, você precisa usar um final /para indicar um caminho completo, mas acho que isso falhará na criação do diretório se ele não existir:

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

Isso também pode faltar oculto. arquivos devido à expansão * glob (sem algunstrabalho específico complicado do shell)

Você pode abordar isso de maneira diferente com sshe tar.

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

Mas isso significa que o tráfego passa pela sua máquina local.

Responder3

limpe-o usando ssh primeiro e depois recrie-o com scp. ou seja, em um arquivo de script ...

ssh -i ~/.ssh/[chave_privada] usuário@servidor2 "rm -rf dir2; sair;"

scp -prq servidor1:dir1 servidor2:dir2

Responder4

Eu bati minha cabeça exatamente nesse mesmo problema, e o que acabei fazendo foi semi-punting: se dir2 for [STUFF]/parent/child2, eu renomeio, copio ou vinculo dir1 (conforme apropriado para a situação) para dir1_child2 no server1 para que seu último caminho componente também é child2, e então basta executar

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

Isso é executado independentemente de child2 estar presente ou não no diretório pai de dir2 e, felizmente, substitui dir2 se estiver.

informação relacionada