Faça o scp sempre sobrescrever ou criar diretório

26

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

scp -prq server1:dir1 server2:dir2

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

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

Estou certo de que falta algo básico, mas simplesmente não consigo resolver.

Qualquer ajuda muito apreciada!

Saudações,

Giles

Ok, tenho menos de 10 representantes e não posso esperar 8 horas, então aqui está o que eu tenho:

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 sei 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 indicar o caminho.

Giles
fonte
você tem acesso scp mas não ssh?
Matt
Isso está correto
Giles
O único problema é que você tentará a segunda cópia em qualquer falha, o que não é necessariamente o dir2 não existe. Talvez se você puder fazer um teste que praticamente não faça nada (por exemplo, copie um diretório em branco). Em seguida, com base na saída quer prazo SCP1 ou SCP2
Matt
Bom ponto, vou manter isso em mente daqui para frente e repassar se tiver alguma coisa.
Giles
Você pode sftp? depois verifique a saída de a cd dir2.
12133 Matt

Respostas:

34

Use esta sintaxe "ponto":

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

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

chronospoon
fonte
2
-p ⇒ "Preserva os tempos de modificação, os tempos de acesso e os modos do arquivo original." -r ⇒ "Copie recursivamente diretórios inteiros." -q ⇒ "Desativa o medidor de progresso." Fonte: computerhope.com/unix/scp.htm
kr85
1
Isso me dá um erro:scp: error: unexpected filename: .
Andrew Koster
1

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

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

Isso também pode estar escondido. arquivos devido à expansão * glob (sem algum trabalho específico complicado da shell )

Você pode abordá-lo 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.

Matt
fonte
scp -prq server1: dir1 / * server2: dir2 /
Giles
@Giles você está dizendo que funciona?
Matt
1
Estranho, editei isso, mas ele se perdeu - não, isso não funciona, se o diretório não existir, o scp dará um erro. Também não tenho o ssh disponível neste caso específico (problema com os direitos do usuário). Isso me dá uma idéia, porém, como estou fazendo isso em um script, posso tentar o acima, capturar qualquer erro e, por erro, tentar a versão básica do meu primeiro post. Obrigado pela ajuda @mindthemonkey
Giles
1
Ele erro 'É um diretório' quando o diretório de destino não existe para mim.
Matt
1
Sim, eu também, um tipo de erro estranho, dado que o diretório não existe.
Giles