Lassen Sie scp immer das Verzeichnis überschreiben oder erstellen

26

Ich verwende scp, um ein Verzeichnis von einem Remote-Server in ein neues Verzeichnis (IE, das nur den Namen ändert) auf einem anderen Remote-Server zu kopieren:

scp -prq server1:dir1 server2:dir2

Dies funktioniert einwandfrei, wenn dir2 nicht auf server2 vorhanden ist. Es wird ein neues Verzeichnis namens dir2 erstellt, das alles von 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 zuvor auf server2 zu entfernen) - was passiert, ist, dass ich eine Kopie von dir1 mit dem Namen dir1 in dir2 erhalte.

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

Jede Hilfe sehr geschätzt!

Grüße,

Giles

Okay, ich habe weniger als 10 Wiederholungen und kann nicht gezwungen werden, 8 Stunden zu warten.

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

Ich bin mir immer noch nicht sicher, wie ich das mit einem einzigen Befehl oder wenn möglich machen soll.

Cheers @mindthemonkey, manchmal kann es hilfreich sein, einen neuen Standpunkt einzunehmen.

Giles
quelle
du hast scp zugang aber nicht ssh?
Matt
Das ist richtig
Giles
Das einzige Problem besteht darin, dass Sie die zweite Kopie bei einem Fehler versuchen, der nicht unbedingt dir2 nicht vorhanden ist. Vielleicht, wenn Sie einen Test finden können, der praktisch nichts bewirkt (z. B. ein leeres Verzeichnis kopieren). Dann basierend auf der Ausgabe entweder scp1 oder scp2 ausführen
Matt
Guter Punkt, ich werde das im Hinterkopf behalten und neu posten, wenn mir etwas einfällt.
Giles
Kannst du sftp? dann überprüfen Sie die Ausgabe von a cd dir2.
Matt

Antworten:

34

Verwenden Sie diese "Punkt" -Syntax:

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

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

Chronospoon
quelle
2
-p ⇒ "Behält die Änderungszeiten, Zugriffszeiten und Modi der Originaldatei bei." -r ⇒ "Kopiere rekursiv ganze Verzeichnisse." -q ⇒ "Deaktiviert die Fortschrittsanzeige." Quelle: computerhope.com/unix/scp.htm
kr85
1
Dies gibt mir einen Fehler:scp: error: unexpected filename: .
Andrew Koster
1

Normalerweise müssen Sie zur Steuerung der Verzeichniserstellung ein Trailing verwenden /, um einen vollständigen Pfad anzugeben, aber ich denke, dass das Verzeichnis dann nicht erstellt werden kann, wenn es nicht vorhanden ist:

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

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

Man kann es mit sshund 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 erfolgt.

Matt
quelle
scp -prq server1: dir1 / * server2: dir2 /
Giles
@Giles sagen Sie, dass das funktioniert?
Matt
1
Seltsamerweise habe ich das bearbeitet, aber es ist verloren gegangen - nein, das funktioniert nicht, wenn das Verzeichnis nicht existiert, gibt scp einen Fehler aus. Außerdem habe ich in diesem speziellen Fall kein ssh zur Verfügung (Problem mit Benutzerrechten). Dies gibt mir jedoch eine Idee, da ich dies in einem Skript mache, kann ich das oben Gesagte versuchen, jeden Fehler erfassen und im Fehlerfall die Basisversion aus meinem ersten Beitrag ausprobieren. Danke für die Hilfe @mindthemonkey
Giles
1
Es gibt den Fehler 'Ist ein Verzeichnis', wenn das Zielverzeichnis für mich nicht existiert.
Matt
1
Ja, ich auch, eine Art seltsamer Fehler, da das Verzeichnis nicht existiert.
Giles