
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)
ssh
Mit 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.