Stellen Sie sicher, dass scp das Verzeichnis immer überschreibt oder erstellt

Stellen Sie sicher, dass scp das Verzeichnis immer überschreibt oder erstellt

Ich verwende scp, um ein Verzeichnis von einem Remote-Server in ein neues Verzeichnis (d. h. ich ändere nur den Namen) auf einem anderen Remote-Server zu kopieren, wie:

scp -prq server1:dir1 server2:dir2

Dies funktioniert einwandfrei, wenn „dir2“ auf Server2 nicht vorhanden ist. Es wird ein neues Verzeichnis mit dem Namen „dir2“ erstellt, das alles aus „dir1“ auf Server1 enthält.

Das Problem tritt auf, wenn dir2 bereits auf Server2 vorhanden ist (HINWEIS: Ich habe keine Möglichkeit, dies im Voraus zu wissen oder dir2 auf Server2 vorher zu entfernen). Was passiert, ist, dass ich eine Kopie von dir1 mit dem Namen dir1 in dir2 erhalte.

Ich bin sicher, dass ich etwas Grundlegendes übersehe, aber ich komme einfach nicht dahinter.

Jede Hilfe ist herzlich willkommen!

Grüße,

Giles

Okay, ich habe weniger als 10 Wiederholungen und habe keine Lust, 8 Stunden zu warten, also hier ist, was ich habe:

Hier ist ein Skript, das bei mir funktioniert:

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

Ich bin mir immer noch nicht sicher, wie das mit einem einzigen Befehl geht und ob es überhaupt möglich ist.

Danke, @mindthemonkey, manchmal kann schon ein neuer Blickwinkel hilfreich sein und die Richtung weisen.

Antwort1

Verwenden Sie diese „Punkt“-Syntax:

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

Dadurch wird der Inhalt dieses Verzeichnisses kopiert und nicht das Verzeichnis selbst. Und ich glaube, es ist portabler als *Globbing.

Antwort2

Normalerweise müssen Sie zur Steuerung der Verzeichniserstellung ein Ende verwenden, /um einen vollständigen Pfad anzugeben. Ich glaube jedoch, dass die Erstellung des Verzeichnisses dann fehlschlägt, wenn es nicht existiert:

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

Dies könnte auch versteckte . Dateien aufgrund der * Glob-Erweiterung übersehen (ohne einigeknifflige Shell-spezifische Arbeit)

sshMit und können Sie es anders angehen tar.

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

Dies bedeutet jedoch, dass der Datenverkehr über Ihren lokalen Computer läuft.

Antwort3

Löschen Sie es zuerst mit SSH und erstellen Sie es dann mit SCP neu, d. h. in einer Skriptdatei ...

ssh -i ~/.ssh/[privater_Schlüssel] Benutzer@Server2 "rm -rf dir2; exit;"

scp -prq server1:dir1 server2:dir2

Antwort4

Ich habe mir genau über dieses Problem den Kopf zerbrochen und bin letztendlich zu einem halben Fehler gekommen: Wenn dir2 ist [STUFF]/parent/child2, benenne ich dir1 um oder kopiere oder verknüpfe es (je nach Situation) mit dir1_child2 auf Server1, sodass seine letzte Pfadkomponente ebenfalls ist child2, und führe dann einfach aus

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

Dies wird ausgeführt, unabhängig davon, ob child2 im übergeordneten Verzeichnis von dir2 vorhanden ist oder nicht, und ersetzt dir2 problemlos, wenn dies der Fall ist.

verwandte Informationen