478 Stimmen

Scp oder sftp kopieren mehrerer Dateien mit einem einzigen Befehl

Ich möchte Dateien von/zum Remote-Server in verschiedenen Verzeichnissen kopieren. Zum Beispiel möchte ich diese 4 Befehle gleichzeitig ausführen.

scp remote:A/1.txt local:A/1.txt
scp remote:A/2.txt local:A/2.txt
scp remote:B/1.txt local:B/1.txt
scp remote:C/1.txt local:C/1.txt

Was ist der einfachste Weg, das zu tun?

26voto

Eox Punkte 341

Nachdem ich eine Weile mit scp gespielt habe, habe ich die robusteste Lösung gefunden:

(Achten Sie auf die einfachen und doppelten Anführungszeichen)

Von lokal nach remote:

scp -r "DATEI1" "DATEI2" HOST:'"VERZEICHNIS"'

Von remote nach lokal:

scp -r HOST:'"DATEI1" "DATEI2"' "VERZEICHNIS"

Beachten Sie, dass alles, was nach "HOST:" kommt, an den Remote gesendet und dort verarbeitet wird. Daher müssen wir sicherstellen, dass sie nicht von der lokalen Shell verarbeitet werden. Deshalb werden einfache Anführungszeichen verwendet. Die doppelten Anführungszeichen werden verwendet, um Leerzeichen in den Dateinamen zu behandeln.

Wenn sich alle Dateien im selben Verzeichnis befinden, können wir * verwenden, um sie alle zu matchen, wie zum Beispiel

scp -r "VERZEICHNIS_IN"/*.txt HOST:'"VERZEICHNIS"'
scp -r HOST:'"VERZEICHNIS_IN"/*.txt' "VERZEICHNIS"

Im Vergleich zur Verwendung der "{}" Syntax, die nur von einigen Shells unterstützt wird, ist diese hier universell

16voto

kmario23 Punkte 49380

Problem: Das Kopieren mehrerer Verzeichnisse vom Remote-Server auf den lokalen Rechner mit einem einzigen SCP-Befehl und Beibehalten jedes Verzeichnisses wie auf dem Remote-Server.

Lösung: SCP kann dies einfach tun. Dies löst das lästige Problem des mehrfachen Passworteingebens beim Verwenden von SCP mit mehreren Ordnern. Dadurch spart man auch viel Zeit!

z.B.

# kopiert die Ordner t1, t2, t3 von `test` in Ihr lokales Arbeitsverzeichnis
# beachten Sie, dass zwischen den Ordnernamen keine Leerzeichen stehen sollten;
# wir escapen auch die Klammern.
# beachten Sie bitte den Punkt am Ende des SCP-Befehls

~$ cd ~/Arbeitsverzeichnis
~$ scp -r username@contact.server.de:/Arbeit/Datensätze/Bilder/test/\{t1,t2,t3\}  .

PS: Inspiriert von dieser großartigen Antwort: Mehrere Dateien mit einem einzigen Befehl kopieren


Gemäß den Kommentaren funktioniert dies auch gut in Git Bash unter Windows

16voto

Tagar Punkte 12059

Der einfachste Weg ist

local$ scp remote:{A/1,A/2,B/3,C/4}.txt ./

So {.. } -Liste kann Verzeichnisse enthalten (A, B und C sind hier Verzeichnisse; "1.txt" und "2.txt" sind Dateinamen in diesen Verzeichnissen).

Auch wenn es alle vier Dateien in ein lokales Verzeichnis kopieren würde - bin mir nicht sicher, ob das ist, was du wolltest.

In diesem Fall werden die Remote-Dateien A/1.txt, A/2.txt, B/3.txt und C/4.txt in ein einziges lokales Verzeichnis kopiert, mit den Dateinamen ./1.txt, ./2.txt, ./3.txt und ./4.txt

12voto

J_rad Punkte 171

Sie können es auf diese Weise tun:

scp hostname@serverNameOrServerIp:/path/to/files/\{file1,file2,file3\}.fileExtension ./

Dies lädt alle aufgelisteten Dateinamen in das lokale Verzeichnis herunter, in dem Sie sich gerade befinden.

Stellen Sie sicher, dass Sie keine Leerzeichen zwischen den Dateinamen verwenden, sondern nur ein Komma ,.

11voto

yuliskov Punkte 1312

Kopiere mehrere Verzeichnisse:

scp -r dir1 dir2 dir3 admin@127.0.0.1:~/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X