Make scp sovrascrive o crea sempre directory


26

Sto usando scp per copiare una directory da un server remoto a una nuova directory (IE sta solo cambiando il nome) su un altro server remoto come:

scp -prq server1:dir1 server2:dir2

Funziona bene se dir2 non esiste su server2, crea una nuova directory chiamata dir2 che contiene tutto da dir1 su server1.

Il problema si presenta quando dir2 esiste già su server2 (NOTA: non ho modo di saperlo in anticipo o di fare una rimozione su dir2 su server2 in anticipo) - quello che succede è che ottengo una copia di dir1, chiamata dir1, in dir2.

Sono sicuro che mi manca qualcosa di base, ma non riesco proprio a risolverlo.

Qualsiasi aiuto molto apprezzato!

Saluti,

Giles

Ok, ho meno di 10 rappresentanti e non posso essere in attesa di 8 ore, quindi ecco cosa ho ottenuto:

Ecco una sceneggiatura che funziona per me:

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

Non sei ancora sicuro di come farlo in un singolo comando o anche se possibile.

Saluti @mindthemonkey, a volte solo ottenere un nuovo punto di vista può aiutare a indicare la strada.


hai accesso scp ma non ssh?
Matt,

È corretto
Giles,

L'unico problema è che proverai la seconda copia in caso di errore, che non è necessariamente dir2 inesistente. Forse se riesci a trovare un test che non fa praticamente nulla (diciamo copia una cartella vuota). Quindi, in base all'output, esegui scp1 o scp2
Matt

Bene, lo terrò a mente per andare avanti e ripubblicare se trovo qualcosa.
Giles,

Sai sftp? quindi controlla l'output di a cd dir2.
Matt,

Risposte:


34

Usa questa sintassi "punto":

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

Questo copia il contenuto di quella directory, piuttosto che la directory stessa. E credo che sia più portatile del *globbing.


2
-p ⇒ "Preserva i tempi di modifica, i tempi di accesso e le modalità dal file originale." -r ⇒ "Copia ricorsivamente intere directory". -q ⇒ "Disabilita l'indicatore di avanzamento". Fonte: computerhope.com/unix/scp.htm
kr85

1
Questo mi dà un errore:scp: error: unexpected filename: .
Andrew Koster,

1

Normalmente per controllare la creazione della directory è necessario utilizzare un trailing /per implicare un percorso completo, ma penso che questo non riuscirà quindi a creare la directory se non esiste:

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

Questo potrebbe anche mancare nascosto. file a causa dell'espansione * glob (senza qualche lavoro specifico della shell )

Puoi affrontarlo diversamente con sshe tar.

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

Ma questo significa che il traffico passa attraverso il tuo computer locale.


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

@Giles stai dicendo che funziona?
Matt,

1
Strano, l'ho modificato ma si è perso - no, non funziona, se la directory non esiste, allora scp dà un errore. Inoltre non ho SSH disponibile in questo caso particolare (problema con i diritti dell'utente). Questo mi dà un'idea però, mentre lo sto facendo in uno script posso provare quanto sopra, catturare qualsiasi errore e, in caso di errore, provare la versione di base dal mio primo post. Grazie per l'aiuto @mindthemonkey
Giles,

1
Errore "È una directory" quando la directory di destinazione non esiste per me.
Matt,

1
Sì, anche io, un tipo di errore strano dato che la directory non esiste.
Giles,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.