it-swarm.com.de

scp oder sftp kopieren mehrere Dateien mit einem einzigen Befehl

Ich möchte Dateien von/auf einen 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

Wie geht das am einfachsten?

265
user987654

Kopieren Sie mehrere Dateien von Remote nach Local:

$ scp [email protected]:/some/remote/directory/\{a,b,c\} ./

Kopieren Sie mehrere Dateien von lokal auf remote:

$ scp foo.txt bar.txt [email protected]:~
$ scp {foo,bar}.txt [email protected]:~
$ scp *.txt [email protected]:~

Kopieren Sie mehrere Dateien von Remote zu Remote:

$ scp [email protected]:/some/remote/directory/foobar.txt \
[email protected]:/some/remote/directory/

Quelle: http://www.hypexr.org/linux_scp_help.php

362
ios.id0

Vom lokalen zum Server:

scp file1.txt file2.sh [email protected]:~/pathtoupload

Vom Server zum lokalen:

scp [email protected]:"file1.log file2.log" "~/yourpathtocopy"

90
Gtr_py

Sie können ganze Verzeichnisse mit dem Schalter -r kopieren. Wenn Sie also Ihre Dateien in ein eigenes Verzeichnis isolieren können, können Sie alles auf einmal kopieren.

scp -r ./dir-with-files [email protected]:upload-path

scp -r [email protected]:path-to-dir-with-files download-path

so zum Beispiel

scp -r [email protected]:/var/log ~/backup-logs

Oder wenn es nur wenige davon gibt, können Sie Folgendes verwenden:

scp 1.txt 2.txt 3.log [email protected]:upload-path
60
Jiri Kremser

Wie Jiri bereits erwähnt hat, können Sie scp -r [email protected]:/some/remote/path /some/local/path verwenden, um Dateien rekursiv zu kopieren. Dies setzt voraus, dass ein einziges Verzeichnis alle Dateien enthält, die Sie übertragen möchten (und nichts anderes).

SFTP bietet jedoch eine Alternative, wenn Sie Dateien aus mehreren verschiedenen Verzeichnissen übertragen möchten und die Ziele nicht identisch sind:

sftp [email protected] << EOF
  get /some/remote/path1/file1 /some/local/path1/file1
  get /some/remote/path2/file2 /some/local/path2/file2
  get /some/remote/path3/file3 /some/local/path3/file3
EOF

Hierbei wird die Syntax "here doc" verwendet, um eine Folge von SFTP-Eingabebefehlen zu definieren. Alternativ können Sie die SFTP-Befehle in eine Textdatei einfügen und sftp [email protected] -b batchFile.txt ausführen.

45
alev

Die Antworten mit {file1,file2,file3} funktionieren nur mit bash (auf remote oder lokal)

Der wahre Weg ist:

scp [email protected]:'/path1/file1 /path2/file2 /path3/file3' /localPath
18
Vouze

Der einfachste Weg ist

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

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

Obwohl es alle diese vier Dateien in ein lokales Verzeichnis kopieren würde - nicht sicher, ob Sie das wollten.

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

14
Tagar

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

(Vorsicht vor einfachen und doppelten Anführungszeichen)

Lokal zu Remote:

scp -r "FILE1" "FILE2" Host:'"DIR"'

Remote zu lokal:

scp -r Host:'"FILE1" "FILE2"' "DIR"

Beachten Sie, dass was auch immer nach "Host:" an die Fernbedienung gesendet und dort analysiert wird. Wir müssen also sicherstellen, dass sie nicht von der lokalen Shell verarbeitet werden. Deshalb kommen einfache Anführungszeichen ins Spiel. Die doppelten Anführungszeichen werden verwendet, um Leerzeichen in den Dateinamen zu behandeln.

Wenn sich alle Dateien im selben Verzeichnis befinden, können Sie mit * alle abgleichen, z

scp -r "DIR_IN"/*.txt Host:'"DIR"'
scp -r Host:'"DIR_IN"/*.txt' "DIR"

Verglichen mit der Syntax "{}", die nur von einigen Shells unterstützt wird, ist diese universell

12
eosphorox

Kopieren Sie mehrere Verzeichnisse:

scp -r dir1 dir2 dir3 [email protected]:~/
12
yuliskov

Problem : Kopieren mehrerer Verzeichnisse vom Remote-Server auf den lokalen Computer mit einem einzigen SCP-Befehl und Beibehalten der Verzeichnisse auf dem Remote-Server.

Lösung : SCP kann dies leicht tun. Dies löst das lästige Problem der mehrfachen Eingabe von Passwörtern bei Verwendung von SCP mit mehreren Ordnern. Das spart also auch viel Zeit!

z.B.

# copies folders t1, t2, t3 from `test` to your local working directory
# note that there shouldn't be any space in between the folder names;
# we also escape the braces.
# please note the dot at the end of the SCP command

~$ cd ~/working/directory
~$ scp -r [email protected]:/work/datasets/images/test/\{t1,t2,t3\}  .

PS: Motiviert durch diese großartige Antwort: scp oder sftp kopieren Sie mehrere Dateien mit einem einzigen Befehl


Basierend auf den Kommentaren funktioniert dies auch in Git Bash unter Windows .

12
kmario23

HINWEIS: Ich entschuldige mich im Voraus für die Beantwortung nur eines Teils der obigen Frage. Ich fand diese Befehle jedoch nützlich für meine aktuellen Unix-Anforderungen.

Hochladen bestimmter Dateien von einem lokalen Computer auf einen Remote-Computer:

~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext [email protected]:Folder1/DestinationFolderForFiles/

Ein gesamtes Verzeichnis von einem lokalen Rechner auf einen entfernten Rechner hochladen:

~$ scp -r Desktop/dump_files [email protected]:Folder1/DestinationFolderForFiles/

Herunterladen eines gesamten Verzeichnisses von einem Remote-Computer auf einen lokalen Computer:

~/Desktop$ scp -r [email protected]:Public/web/ Desktop/

3
fat43r 80ard

ihr Befehl funktioniert perfekt, aber ich möchte auch den Dateinamen ändern, während ich lokal an remote sende. Ich schrieb einen Befehl: - sshpass -p Passwort scp /path/to/file.txt root @ hostname: /path/newfile.txt

Aber es gibt Fehler, dass /path/newfile.txt: Keine solche Datei oder Verzeichnis gefunden plz mir in dieser Situation helfen

2
Reshmi K C

In meinem Fall darf ich nur den Befehl sftp verwenden.
Also musste ich eine Batchdatei mit sftp verwenden. Ich habe ein Skript wie das folgende erstellt. Dies setzt voraus, dass Sie im Verzeichnis/tmp arbeiten und die Dateien im Verzeichnis destdir_on_remote_system auf dem fernen System ablegen möchten. Dies funktioniert auch nur mit einem nicht interaktiven Login. Sie müssen öffentliche/private Schlüssel einrichten, damit Sie sich ohne Eingabe eines Kennworts anmelden können. Ändern Sie nach Bedarf.

#!/bin/bash

cd /tmp
# start script with list of files to transfer
ls -1 fileset1* > batchfile1
ls -1 fileset2* >> batchfile1

sed -i -e 's/^/put /' batchfile1
echo "cd destdir_on_remote_system" > batchfile
cat batchfile1 >> batchfile
rm batchfile1

sftp -b batchfile [email protected]
2
dminear

scp verwendet ssh für die Datenübertragung mit derselben Authentifizierung und bietet dieselbe Sicherheit wie ssh.

Hier empfiehlt es sich, "SSH KEYS AND PUBLIC KEY AUTHENTICATION" zu implementieren. Auf diese Weise können Sie Ihre Skripte schreiben, ohne sich um die Authentifizierung kümmern zu müssen. So einfach ist das.

Siehe WAS IS SSH-KEYGEN

1
augusto

In dem speziellen Fall, in dem alle Dateien die gleiche Erweiterung haben, aber mit einem anderen Suffix (z. B. der Nummer der Protokolldatei), verwenden Sie Folgendes:

scp [email protected]:/some/log/folder/some_log_file.* ./

Dies kopiert alle Dateien mit dem Namen some_log_file aus dem angegebenen Ordner in der Fernbedienung, d. H. Some_log_file.1, some_log_file.2, some_log_file.3 ....

1
Guy Avraham
scp remote:"[A-C]/[12].txt" local:
0
unxnut