Ich möchte Dateien von/zu einem entfernten Server in verschiedene Verzeichnisse kopieren. Ich möchte zum Beispiel diese 4 Befehle auf einmal 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 kann ich das am einfachsten machen?
Kopieren Sie mehrere Dateien von remote nach lokal:
$ scp [email protected]:/some/remote/directory/\{a,b,c\} ./
Kopieren Sie mehrere Dateien von lokal nach 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/
Vom lokalen zum Server:
scp file1.txt file2.sh [email protected]:~/pathtoupload
Vom Server zu lokal:
scp -T [email protected]:"file1.txt file2.txt" "~/yourpathtocopy"
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 user@remote-server:upload-path
scp -r user@remote-server:path-to-dir-with-files download-path
so zum Beispiel
scp -r [email protected]:/var/log ~/backup-logs
Oder wenn es nur wenige sind, kann man sie verwenden:
scp 1.txt 2.txt 3.log user@remote-server:upload-path
Wie Jiri erwähnte, können Sie scp -r user@host:/some/remote/path /some/local/path
verwenden, um Dateien rekursiv zu kopieren.
Dies setzt voraus, dass es's ein einziges Verzeichnis gibt, das alle Dateien enthält, die Sie übertragen wollen (und nichts anderes).
SFTP bietet jedoch eine Alternative, wenn Sie Dateien aus mehreren verschiedenen Verzeichnissen übertragen wollen und die Ziele nicht identisch sind:
sftp user@host << 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
Dabei wird die Syntax "hier doc" verwendet, um eine Sequenz von SFTP-Eingabebefehlen zu definieren.
Als Alternative könnten Sie die SFTP-Befehle in eine Textdatei schreiben und sftp user@host -b batchFile.txt
ausführen.
Der einfachste Weg ist
local$ scp remote:{A/1,A/2,B/3,C/4}.txt ./
Also {... } 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 - ich bin nicht sicher, ob das's ist, was Sie wollten.
Im obigen Fall werden Sie am Ende 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, ./2.txt, ./3.txt und ./4.txt kopieren.
Nachdem ich eine Weile mit scp gespielt habe, habe ich die robusteste Lösung gefunden:
(Vorsicht vor den einfachen und doppelten Anführungszeichen)
Lokal bis entfernt:
scp -r "FILE1" "FILE2" HOST:'"DIR"'
Von entfernt nach lokal:
scp -r HOST:'"FILE1" "FILE2"' "DIR"
Beachten Sie, dass was auch immer nach "HOST:" an die Gegenstelle gesendet und dort geparst wird. Wir müssen also sicherstellen, dass sie nicht von der lokalen Shell verarbeitet werden. Aus diesem Grund kommen einfache Anführungszeichen zum Einsatz. Die doppelten Anführungszeichen werden zur Behandlung von Leerzeichen in den Dateinamen verwendet.
Wenn sich alle Dateien im gleichen Verzeichnis befinden, können wir * verwenden, um sie alle abzugleichen, z.B.
scp -r "DIR_IN"/*.txt HOST:'"DIR"'
scp -r HOST:'"DIR_IN"/*.txt' "DIR"
Im Vergleich zur Verwendung des "{}" die nur von einigen Shells unterstützt wird, ist diese Syntax universell
Problem: Kopieren mehrerer Verzeichnisse vom Remote-Server auf einen lokalen Rechner mit einem einzigen SCP-Befehl und Beibehaltung jedes Verzeichnisses so, wie es auf dem Remote-Server ist.
Lösung: SCP kann dies leicht bewerkstelligen. Damit wird das lästige Problem der mehrfachen Passworteingabe bei der Verwendung von SCP mit mehreren Verzeichnissen gelöst. Folglich spart dies auch eine Menge 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 mehrere Dateien mit einem einzigen Befehl ][1]
Basierend auf den Kommentaren funktioniert dies auch in Git Bash unter Windows gut
HINWEIS: Ich entschuldige mich im Voraus dafür, dass ich nur einen Teil der obigen Frage beantwortet habe. Ich fand jedoch, dass diese Befehle für meine aktuellen Unix-Bedürfnisse nützlich sind.
Hochladen bestimmter Dateien von einem lokalen Rechner auf einen entfernten Rechner:
~/Desktop/dump_files$ scp-Datei1.txt-Datei2.txt lab1.cpp usw.ext [email protected]:Folder1/DestinationFolderForFiles/
Hochladen eines gesamten Verzeichnisses von einem lokalen Rechner auf einen entfernten Rechner:
~$ scp -r Desktop/dump_files [email protected]:Folder1/DestinationFolderForFiles/
Herunterladen eines ganzen Verzeichnisses von einem entfernten Rechner auf einen lokalen Rechner:
~/Desktop$ scp -r [email protected]:Public/web/ Desktop/
Ihr Befehl funktioniert perfekt, aber ich möchte auch den Dateinamen ändern, während ich von lokal nach remote sende. Ich habe einen Befehl geschrieben:- sshpass -p Kennwort scp /pfad/zur/datei.txt root@hostname:/path/newfile.txt
Aber es ergibt den Fehler, dass /pfad/neueDatei.txt: Keine solche Datei oder Verzeichnis gefunden plz helfen Sie mir in dieser Situation
In meinem Fall bin ich darauf beschränkt, nur den Befehl sftp zu 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 entfernten System ablegen wollen. Auch dies funktioniert nur mit einer nicht interaktiven Anmeldung. Sie müssen öffentliche/private Schlüssel einrichten, damit Sie sich ohne Eingabe eines Passworts 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 user@host
In dem speziellen Fall, dass alle Dateien die gleiche Endung, aber ein unterschiedliches Suffix haben (z.B. die 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 innerhalb der Fernbedienung, d.h. - some_log_file.1 , some_log_file.2, some_log_file.3 ....
scp verwendet ssh für die Datenübertragung mit der gleichen Authentifizierung und bietet die gleiche Sicherheit wie ssh.
Eine bewährte Praxis ist hier die Implementierung von "SSH-Schlüssel und PUBLIC KEY AUTHENTICATION". Damit können Sie Ihre Skripte schreiben, ohne sich Gedanken über die Authentifizierung machen zu müssen. So einfach ist das.
Siehe [WAS IST SSH-KEYGEN][1]
Sie können dies auf diese Weise tun:
scp hostname@serverNameOrServerIp:/path/to/files/\\{file1,file2,file3\\}.fileExtension ./
Dadurch werden alle aufgelisteten Dateinamen in das lokale Verzeichnis heruntergeladen, in dem Sie sich befinden're.
Achten Sie darauf, keine Leerzeichen zwischen die einzelnen Dateinamen zu setzen, verwenden Sie nur ein Komma ,
.