Frage Machen Sie scp immer überschreiben oder Verzeichnis erstellen


Ich benutze scp um ein Verzeichnis von einem entfernten Server in ein neues Verzeichnis zu kopieren (IE ändert nur den Namen) auf einem anderen entfernten Server wie:

scp -prq server1:dir1 server2:dir2

Das funktioniert gut, wenn dir2 auf Server2 nicht existiert, es erstellt ein neues Verzeichnis namens dir2, das alles von dir1 auf server1 enthält.

Das Problem tritt auf, wenn dir2 bereits auf server2 existiert (HINWEIS: Ich habe keine Möglichkeit, dies vorher zu wissen oder vorher auf dem Server2 auf Server2 zu entfernen) - was passiert ist, bekomme ich eine Kopie von dir1, genannt dir1, in dir2.

Ich bin mir sicher, dass es etwas Grundlegendes gibt, das mir fehlt, aber ich kann es einfach nicht verstehen.

Jede Hilfe sehr geschätzt!

Grüße,

Giles

Okay, ich habe weniger als 10 Wiederholungen und kann nicht gewartet werden, um 8 Stunden zu warten, also hier ist, was ich habe:

Hier ist ein Skript, das für mich 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

Immer noch nicht sicher, wie dies in einem einzigen Befehl oder sogar wenn möglich zu tun ist.

Prost @ mindthemonkey, manchmal nur eine neue Sichtweise kann helfen, den Weg weisen.


23
2017-09-12 12:14


Ursprung


Sie haben scp Zugriff, aber nicht ssh? - Matt
Das ist richtig - Giles
Das einzige Problem dort ist, dass Sie versuchen, die zweite Kopie bei einem Fehler, der nicht unbedingt dir2 nicht existiert. Vielleicht, wenn Sie einen Test machen können, der praktisch nichts tut (zB ein leeres Verzeichnis kopieren). Führen Sie dann basierend auf der Ausgabe entweder scp1 oder scp2 aus - Matt
Guter Punkt, ich werde das im Hinterkopf behalten und neu posten, wenn ich mir etwas einfallen lasse. - Giles
Kannst du sftp? Überprüfen Sie dann die Ausgabe von a cd dir2. - Matt


Antworten:


Verwenden Sie diese "Punkt" -Syntax:

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

Dies kopiert den Inhalt dieses Verzeichnisses und nicht das Verzeichnis selbst. Und ich glaube, es ist tragbarer als * globbing.


30
2017-11-18 19:36



-p ⇒ "Behält Änderungszeiten, Zugriffszeiten und Modi aus der Originaldatei bei." -r ⇒ "Gesamte Verzeichnisse rekursiv kopieren." -q ⇒ "Deaktiviert die Fortschrittsanzeige." Quelle: computerhope.com/unix/scp.htm - kr85


Um die Verzeichniserstellung zu steuern, müssen Sie normalerweise ein trailing verwenden / einen vollständigen Pfad zu implizieren, aber ich denke, das wird dann das Verzeichnis nicht erstellen, wenn es nicht existiert:

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

Dies könnte auch verborgen bleiben. Dateien aufgrund der * glob-Erweiterung (ohne einige knifflige Shell-spezifische Arbeit)

Sie können es anders angehen mit ssh und tar.

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

Das bedeutet jedoch, dass der Verkehr über Ihren lokalen Computer läuft.


0
2017-09-12 12:47



scp -prq server1: dir1 / * server2: dir2 / - Giles
@Giles sagst du, dass das funktioniert? - Matt
Seltsam, ich habe das bearbeitet, aber es ist verloren gegangen - nein, das funktioniert nicht, wenn das Verzeichnis nicht existiert, gibt scp einen Fehler. Auch ich habe ssh in diesem speziellen Fall nicht verfügbar (Problem mit Benutzerrechten). Das gibt mir jedoch eine Idee, da ich dies in einem Skript mache, kann ich das oben beschriebene versuchen, jeden Fehler erfassen und, irrtümlicherweise, die Basisversion von meinem ersten Beitrag ausprobieren. Danke für die Hilfe @mindthemonkey - Giles
Es ist ein Fehler "Ist ein Verzeichnis", wenn das Zielverzeichnis für mich nicht existiert. - Matt
Ja, ich auch, irgendwie ein seltsamer Fehler, da das Verzeichnis nicht existiert. - Giles