Kann scp Verzeichnisse rekursiv kopieren?


572

Derzeit kann ich nur eine einzelne .tarDatei kopieren . Aber wie kann ich Verzeichnisse rekursiv mit kopieren scp?

Antworten:


935

Ja, benutze -r:

scp -rp sourcedirectory user@dest:/path
  • -r bedeutet rekursiv
  • -p behält die Änderungszeiten, Zugriffszeiten und Modi der Originaldatei bei.

Hinweis: Dadurch wird das sourcedirectoryInnere erstellt, in dem sich /pathdie Dateien befinden/path/sourcedirectory


9
Beachten Sie jedoch, dass Symlinks dadurch nicht erhalten bleiben.
CpnCrunch

12
Beachten Sie, dass -pr(Optionen in umgekehrter Reihenfolge) die Ordner nicht kopieren, sondern ihren Inhalt in das Zielverzeichnis kopieren (anscheinend ist die Reihenfolge der Optionen von Bedeutung).
pms

171

Obwohl die vorherigen Antworten technisch korrekt sind, sollten Sie rsyncstattdessen auch die Verwendung in Betracht ziehen . rsyncvergleicht die Daten auf der Sende- und Empfangsseite mit einem Diff-Mechanismus, damit bereits gesendete Daten nicht erneut gesendet werden müssen.

Wenn Sie etwas mehr als einmal auf einen Remote-Computer kopieren möchten, verwenden Sie rsync. Eigentlich ist es gut, rsyncjedes Mal zu verwenden, da es mehr Steuerelemente zum Kopieren von Dateiberechtigungen und -besitz sowie zum Ausschließen bestimmter Dateien oder Verzeichnisse enthält. Im Allgemeinen:

$ rsync -av /local/dir/ server:/remote/dir/

synchronisiert ein lokales Verzeichnis mit einem entfernten Verzeichnis. Wenn Sie es ein zweites Mal ausführen und sich der Inhalt des lokalen Verzeichnisses nicht geändert hat, werden keine Daten übertragen - viel effizienter als scpjedes Mal alles auszuführen und zu kopieren.

Außerdem rsynckönnen Sie sich im Gegensatz zu unterbrochenen Übertragungen sehr leicht erholen scp.

Schließlich werden moderne Versionen rsyncvon standardmäßig über ssh ausgeführt. Wenn dies scpalso bereits funktioniert, rsyncsollte dies praktisch ein Ersatz sein.


1
Ich stimme zu, rsyncist effizienter. Eine Sache, die es derzeit nicht scptut, ist das Kopieren zwischen entfernten Hosts (zumindest ohne den rsync-Client auf einem von ihnen auszuführen).
Cedric Knight

1
-av: v steht für ausführlich, a für archiv und ist eine Verknüpfung zu -rlptgoD, die rekursiv impliziert, dass die Daten und Links der Rechteinhaber erhalten bleiben. Wenn Sie nur rekursiv verwenden möchten-r
pdem


10

Rekursive Kopieroption '-r' (Kleinbuchstaben)

scp -r

Was ich mit der regulären lokalen rekursiven Kopieroption '-R' verwechsle (Großbuchstaben)

cp -R

1
Ich wollte nur auf den Unterschied zwischen cp und scp hinweisen, da -r und -R nicht dasselbe sind. unix.stackexchange.com/questions/18712/…
Tarun

6

Am besten verwenden Sie rsync über SSH

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

Meine Lieblingsoptionen sind -Pazvessh --delete:

  • -a: Archivierungsmodus (enthält viele häufig verwendete Standardoptionen, einschließlich der Beibehaltung von Symlinks)
  • -z: komprimieren
  • -v: ausführlich: Dateien anzeigen
  • -P: Fortschritt als erledigte Dateien / verbleibende Dateien anzeigen
  • -e ssh: mache rsync im ssh-Protokoll
  • --delete: Löscht Dateien im Ziel, die sich nicht mehr in der Quelle befinden

Alle Versionen rsync, die ich verwendet habe, würden sshstandardmäßig verwendet, daher -esshist es unwahrscheinlich, dass sie benötigt werden. Und die Wahl des Befehls, der zum Herstellen einer Verbindung zum Remote-Host verwendet wird, hat nichts mit dem rekursiven Kopieren zu tun.
Kasperd

4

Nachdem ich nach dem rekursiven Kopier-Flag gesucht und es dank dieses Posts erfolgreich verwendet habe, möchte ich nur einen Vorschlag posten.

In diesem Fall kopieren Sie (rekursiv) ein Verzeichnis. Wenn die Dateien komprimiert gesendet werden, können Sie möglicherweise Zeit bei der Übertragung sparen

Was ich am Ende gemacht habe war:

local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz

Hoffe das hilft


Die Dateierweiterung sollte entweder .tar.gzoder sein, .tgzda die Datei ein gezipptes Tar-Archiv ist (da das -zFlag verwendet wird).
Anthony Bell

2

Mit diesem einfachen Befehl können Sie ein Verzeichnis rekursiv in ein komprimiertes Archiv kopieren:

ssh -p 22 user@address-to-copy-from.com  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

Um beispielsweise Inhalte von /var/logvon domain.comzu kopieren , führen ~/logs.tgzSie Folgendes aus:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' > ~/logs.tgz

Sie können Dateien auf dem Zielsystem auch mithilfe von Pipes extrahieren. Dieser Befehl kopiert den Inhalt von /var/logat domain.comto ~/destination/logauf Ihr System:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

Um ein Verzeichnis zu spiegeln, sollten Sie wahrscheinlich rsync...


1

Wenn Sie es vorziehen, das Kennwort des Benutzers als Parameter zu übergeben, anstatt es interaktiv einzugeben, können Sie sshpass( sudo apt-get install -y sshpass) verwenden.

Beispiel:

sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@122.10.12.123:/dest/folder

0

Sie können die Option -r mit dem Befehl scp verwenden, um Verzeichnisse auf einem beliebigen System rekursiv zu kopieren. Wenn Sie weitere Informationen benötigen, lesen Sie das Tutorial zum Befehl scp . Die Option -r steht für eine rekursive Operation in den meisten Linux-Befehlen.


Die -rOption wurde zwar schon vor Jahren vorgeschlagen und ist die akzeptierte Antwort.
RalfFriedl

-3

Eine andere (wahrscheinlich bessere für die wiederholte Verwendung) Option ist die Verwendung von NFS. Schauen Sie sich den NFS-Kernel-Server an und erfahren Sie, wie Sie NFS-Freigaben einrichten.


2
Das ist völliger Unsinn. Es gibt endlose Fälle, in denen Sie scpNFS verwenden würden , dies ist jedoch keine Option.
Sven
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.