scp of sftp meerdere bestanden kopiëren met één commando

Ik wil graag bestanden kopiëren van/naar een externe server in verschillende mappen.
Ik wil bijvoorbeeld deze 4 opdrachten tegelijk uitvoeren.

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

Wat is de gemakkelijkste manier om dat te doen?


Antwoord 1, autoriteit 100%

Kopieer meerdere bestanden van extern naar lokaal:

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

Kopieer meerdere bestanden van lokaal naar extern:

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

Kopieer meerdere bestanden van afstandsbediening naar afstandsbediening:

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

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


Antwoord 2, autoriteit 45%

Van lokaal naar server:

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

Van server naar lokaal:

scp -T [email protected]:"file1.txt file2.txt" "~/yourpathtocopy"


Antwoord 3, autoriteit 17%

Je kunt hele mappen kopiëren met de schakelaar -r, dus als je je bestanden in een eigen map kunt isoleren, kun je alles in één keer kopiëren.

scp -r ./dir-with-files user@remote-server:upload-path
scp -r user@remote-server:path-to-dir-with-files download-path

dus bijvoorbeeld

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

Of als er maar een paar zijn, kunt u het volgende gebruiken:

scp 1.txt 2.txt 3.log user@remote-server:upload-path

Antwoord 4, autoriteit 12%

Zoals Jiri al zei, kun je scp -r user@host:/some/remote/path /some/local/path gebruiken om bestanden recursief te kopiëren. Dit veronderstelt dat er een enkele map is die alle bestanden bevat die u wilt overbrengen (en niets anders).

SFTP biedt echter een alternatief als u bestanden uit meerdere verschillende mappen wilt overbrengen en de bestemmingen niet identiek zijn:

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

Dit gebruikt de “here doc”-syntaxis om een ​​reeks SFTP-invoeropdrachten te definiëren. Als alternatief kunt u de SFTP-commando’s in een tekstbestand plaatsen en sftp user@host -b batchFile.txt

uitvoeren


Antwoord 5, autoriteit 7%

De antwoorden met {file1,file2,file3} werken alleen met bash (op afstand of lokaal)

De echte manier is:

scp user@remote:'/path1/file1 /path2/file2 /path3/file3' /localPath

Antwoord 6, autoriteit 4%

Na een tijdje met scp te hebben gespeeld, heb ik de meest robuuste oplossing gevonden:

(Pas op voor de enkele en dubbele aanhalingstekens)

Lokaal naar extern:

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

Op afstand naar lokaal:

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

Merk op dat alles wat na “HOST:” naar de afstandsbediening wordt verzonden en daar wordt geparseerd. We moeten er dus voor zorgen dat ze niet door de lokale shell worden verwerkt. Daarom komen er enkele aanhalingstekens voor. De dubbele aanhalingstekens worden gebruikt om spaties in de bestandsnamen te verwerken.

Als bestanden allemaal in dezelfde map staan, kunnen we * gebruiken om ze allemaal te matchen, zoals

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

Vergeleken met het gebruik van de “{}”-syntaxis die alleen door sommige shells wordt ondersteund, is deze universeel


Antwoord 7, autoriteit 3%

De eenvoudigste manier is

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

Dus {.. } lijst kan mappen bevatten (A, B en C hier zijn mappen; “1.txt” en “2.txt” zijn bestandsnamen in die mappen).

Hoewel het al deze vier bestanden naar één lokale map zou kopiëren, weet ik niet zeker of dat is wat je wilde.

In het bovenstaande geval zul je de externe bestanden A/1.txt, A/2.txt, B/3.txt en C/4.txt kopiëren naar een enkele lokale map, met bestandsnamen ./1 .txt, ./2.txt, ./3.txt en ./4.txt


Antwoord 8, autoriteit 3%

Probleem: meerdere mappen kopiëren van een externe server naar een lokale machine met behulp van een enkele SCP-opdracht en elke map behouden zoals deze zich op de externe server bevindt.

Oplossing: SCP kan dit eenvoudig doen. Dit lost het vervelende probleem op van het meerdere keren invoeren van een wachtwoord bij gebruik van SCP met meerdere mappen. Dit scheelt dus ook veel tijd!

bijv.

# 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: Gemotiveerd door dit geweldige antwoord: scp of sftp kopieer meerdere bestanden met één opdracht


Op basis van de opmerkingen werkt dit ook prima in Git Bash op Windows


Antwoord 9, autoriteit 2%

Meerdere mappen kopiëren:

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

Antwoord 10

Je kunt het als volgt doen:

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

Hiermee worden alle vermelde bestandsnamen gedownload naar de lokale map waarin u zich bevindt.

Zorg ervoor dat er geen spaties tussen elke bestandsnaam staan, gebruik alleen een komma ,.


Antwoord 11

OPMERKING: bij voorbaat mijn excuses voor het beantwoorden van slechts een deel van de bovenstaande vraag. Ik vond deze commando’s echter nuttig voor mijn huidige Unix-behoeften.

Specifieke bestanden uploaden van een lokale computer naar een externe computer:

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

Een volledige map uploaden van een lokale machine naar een externe machine:

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

Een volledige map downloaden van een externe machine naar een lokale machine:

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


Antwoord 12

In mijn geval ben ik beperkt tot het gebruik van de opdracht sftp.
Ik moest dus een batchbestand met sftp gebruiken. Ik heb een script gemaakt zoals het volgende. Dit veronderstelt dat u in de map /tmp werkt en dat u de bestanden in destdir_on_remote_system op het externe systeem wilt plaatsen. Dit werkt ook alleen met een niet-interactieve login. U moet openbare/privésleutels instellen zodat u kunt inloggen zonder een wachtwoord in te voeren. Wijzig indien nodig.

#!/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

Antwoord 13

In het specifieke geval waarin alle bestanden dezelfde extensie hebben maar met een ander achtervoegsel (bijvoorbeeld het nummer van het logbestand), gebruik je het volgende:

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

Hiermee worden alle bestanden met de naam some_log_file gekopieerd uit de opgegeven map in de afstandsbediening, dwz- some_log_file.1 , some_log_file.2, some_log_file.3 ….


Antwoord 14

Is eenvoudiger zonder scp te gebruiken:

tar cf - file1 ... file_n | ssh user@server 'tar xf -'

Hiermee kun je ook een aantal dingen doen, zoals het comprimeren van de stream (-C) of (sinds OpenSSH v7.3) -J om op elk moment door een stream te springen (of meer) proxyservers.

U kunt voorkomen dat u wachtwoorden gebruikt die uw openbare sleutel kopiëren naar ~/.ssh/authorized_keys met ssh-copy-id.

Ook hier geplaatst (met meer details) en hier.


Antwoord 15

scp remote:"[A-C]/[12].txt" local:

Antwoord 16

scp gebruikt ssh voor gegevensoverdracht met dezelfde authenticatie en biedt dezelfde beveiliging als ssh.

Een best practice hier is om “SSH-SLEUTELS EN PUBLIC KEY AUTHENTICATION” te implementeren. Hiermee kunt u uw scripts schrijven zonder u zorgen te maken over authenticatie. Zo simpel.

Zie WAT IS SSH-KEYGEN

LEAVE A REPLY

Please enter your comment!
Please enter your name here

20 + three =

Other episodes