УПП або SFTP скапіяваць некалькі файлаў з адной камандай

Я хацеў бы, каб скапіяваць файлы з/на выдалены сервер у розных каталогах. Напрыклад, я хачу, каб запусціць гэтыя 4 каманды адразу.

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

Што гэта самы просты спосаб зрабіць гэта?

200
Я хацеў бы прапанаваць вам зірнуць на Rsync , можа быць, гэта можа дапамагчы вам у гэтым выпадку і многіх маючых адбыцца спраў. Тады, каб не ўводзіць паролі (не кажучы ўжо некалькі разоў), вы павінны прачытаць пра SSH дзяржаўныя/прыватныя ключы, напрыклад, digitalocean.com/community/tutorials/how -у-SET-UP-SSH-ключи- & ZWNJ; -2
дададзена аўтар mnagel, крыніца
stackoverflow.com/a/23748561/874188 (вылучаны ў якасці дубліката гэтага) мае прыемны дадатковы метад.
дададзена аўтар tripleee, крыніца
Сцэнар? ......
дададзена аўтар Oliver Charlesworth, крыніца
Пазбягайце паўтарэння пароль такім чынам: ПКПП аддалены: "A/1.txt A/2.txt B/1.txt C/1.txt" мясцовыя: ./
дададзена аўтар JohnMudd, крыніца
Прыклад заснаваны на @JohnMudd 's адказ: УПП [email protected]:'/і г.д./OpenVPN/ca.crt /etc/openvpn/client/client0.crt /etc/openvpn/client/client0.key/і г.д. /openvpn/client/ta.key»./.
дададзена аўтар Eduardo Lucio, крыніца
Калі я зрабіў сцэнар, я павінен быў паставіць пароль для кожнай каманды. Ці магу я пазбегнуць гэтага?
дададзена аўтар user987654, крыніца

14 адказы

Капіраванне некалькіх файлаў з аддаленага на лакальны:

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

Капіраванне некалькіх файлаў з лакальнага на аддалены:

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

Капіраванне некалькіх файлаў з аддаленага на пульце дыстанцыйнага кіравання:

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

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

284
дададзена
Першая каманда апушчана канчатак "", і '{а, Ь, з}' роўна \ {A, B, C \}.
дададзена аўтар duleshi, крыніца
Я думаю OP спрабуе скапіяваць некалькі файлаў у некалькіх лакальных тэчак у некалькіх аддаленых папак, гэтыя прыклады не будзе рабіць гэтую працу, так як усе яны будуць ПКПП файлы ~ або ./ толькі.
дададзена аўтар aesede, крыніца
@MarceloVentura, @duleshi: Акрамя таго, я хацеў бы дадаць, што з дапамогай кнопак \ {а, Ь, с \} будзе перадаваць файлы ў адно злучэнне/партыі (так як яны будуць пашыраны на аддалены хост), у той час як, выкарыстоўваючы {а, Ь, з} будзе адкрываць некалькі злучэнняў, а таксама накладныя выдаткі даволі прыкметна пры перадачы вялікай колькасці файлаў
дададзена аўтар omninonsense, крыніца
па памылцы я надрукаваў, УПП [email protected]:/некаторыя/выдалены/каталог/\ {а, Ь, с \} ./ (<�я> апавяшчэнне прабел пасля коскі ў а , б , з ), і гэта не атрымалася - ні прасторы паміж імёнамі файлаў не важна адзначыць !!
дададзена аўтар NoobEditor, крыніца
Каб скапіяваць, скажам, * CSV з аддаленага на лакальны, УПП -p з @ б: .../TMP/\ * CSV працуе.
дададзена аўтар Noumenon, крыніца
Сцеражыцеся: без прабелаў пасля косак ўнутры фігурных дужак. Я толькі што правёў 10 хвілін, спрабуючы зразумець, чаму мая каманда не працуе, і гэта з-за прабелаў.
дададзена аўтар deepak, крыніца
@duleshi {а, Ь, з} не ў дакладнасці роўная \ {а, Ь, с \} пры капіяванні з аддаленага на лакальны, для першага патрабуецца пароль для кожнага файла, у той час як другі патрабуе пароль толькі адзін раз.
дададзена аўтар Marcelo Ventura, крыніца

Ад лакальнага да сервера:

<�Код> УПП file1.txt file2.sh [email protected]: ~/pathtoupload

Ад сервера да мясцовых:

<�Код> УПП [email protected]: "File1.log file2.log" "~/yourpathtocopy"

64
дададзена

Вы можаце капіяваць цэлыя каталогі з дапамогай -r перамыкач, так што калі вы можаце ізаляваць вашыя файлы ў асобны каталог, вы можаце скапіяваць усё адразу.

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

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

так, напрыклад,

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

Або, калі ёсць толькі некалькі з іх, вы можаце выкарыстаць:

scp 1.txt 2.txt 3.log [email protected]:upload-path
48
дададзена
гэта можа быць даволі небяспечна, але ён павінен працаваць
дададзена аўтар Jiri Kremser, крыніца
Ці значыць гэта працаваць, калі маё прызначэнне корань, і я раблю каталог і г.д., як, напрыклад: УПП -r/рэзервовае капіраванне/і г.д. корань @ linuxbox: /, дзе мой крыніца з'яўляецца вельмі рэдкі каталог з такімі рэчамі як «гаспадароў» і Nginx/сайтаў -Доступно і г.д.?
дададзена аўтар Tomachi, крыніца

Як ужо згадвалася Іржы, вы можаце выкарыстоўваць Scp -r карыстальнік @ хост:/некаторыя/выдалены/шлях/некаторыя/лакальны/шлях , каб скапіяваць файлы рэкурсіўна. Гэта прадугледжвае, што ёсць адзін каталог, які змяшчае ўсе файлы, якія вы хочаце, каб перадаць (і нічога больш).

Тым не менш, SFTP з'яўляецца альтэрнатывай, калі вы хочаце перанесці файлы з некалькіх розных каталогаў, і адрасаты не зьяўляюцца ідэнтычнымі:

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

This uses the "here doc" syntax to define a sequence of SFTP input commands. As an alternative, you could put the SFTP commands into a text file and execute sftp [email protected] -b batchFile.txt

29
дададзена
Гэта адзіны адказ, які на самай справе адказвае на пытанне. Дзякуючы. Я трошкі і аналіз УПП кіраўніцтва для занадта доўга спрабуе знайсці гэтую функцыю, і я думаю, УПП не мае яго.
дададзена аўтар sudo, крыніца
Гэта, здаецца, самы лепшы, самы гнуткі адказ. Заўвага: Я атрымаў падножку, пакуль я не зразумеў, што трэба выкарыстоўваць поўны шлях /дома/валацуга/Код/ замест ~/код/​​.
дададзена аўтар Ryan, крыніца
Гэта лепшы адказ, толькі не забудзьцеся дадаць - г для каталогаў
дададзена аўтар Chris_Rands, крыніца

Самы просты спосаб

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

Так спіс {..} можа ўключаць у сябе каталогі (A, B і C тут з'яўляюцца каталогамі, «1.txt» і «2.txt» імёны файлаў у гэтых каталогах).

Хоць было б скапіяваць ўсе гэтыя чатыры файла ў адзін лакальны каталог - не ўпэўнены, што гэта тое, што вы хацелі.

У прыведзеным вышэй выпадку, вы будзеце ў канчатковым выніку выдаленыя файлы A/1.TXT, A/2.txt, B/3.txt і C/4.txt скапіраваныя да адной лакальнай дырэкторыі, з імёнамі файлаў ./1.txt, ./2.txt, ./3.txt і ./4.txt

14
дададзена
Brace пашырэнне, як гэта з'яўляецца асаблівасцю Bash, а не партатыўная, напрыклад, POSIX ш .
дададзена аўтар tripleee, крыніца
добры пункт .. скарэкціраваны прыклад (так што цяпер яна не будзе перазапісваць) і дадаў апісанне. Дзякуючы.
дададзена аўтар Tagar, крыніца
@tripleee, дзякуй. яна не можа быць POSIX, але гэта працуе не толькі ў баш. Я выкарыстоўваю КШ ўвесь час, і яна працуе там.
дададзена аўтар Tagar, крыніца
Ці не будзе гэта перазапісаць змесціва A/1.txt з утрыманнем B/1.txt на лакальнай машыне?
дададзена аўтар Yves Dorfsman, крыніца
Вы можаце таксама змяшаць каталогі і файлы, выканаўшы: лакальным $ УПП -r аддаленага: {A/1.txt, A/2.txt, B/3.txt, C/4.txt, D, F}./
дададзена аўтар donhector, крыніца

Скапіюйце некалькі каталогаў:

scp -r dir1 dir2 dir3 [email protected]:~/
10
дададзена
Гэта ўжо адказ Іржы Крэмэр
дададзена аўтар Tobias Liefke, крыніца
Пытанне заключаўся ў тым, каб скапіяваць з аддаленага каталога ў лакальны, а не наадварот.
дададзена аўтар Tagar, крыніца

Адказы з кодам <> {file1, file2, file3} працуе толькі з Баш (на пульце дыстанцыйнага кіравання або лакальна)

Рэальны спосаб:

scp [email protected]:'/path1/file1 /path2/file2 /path3/file3' /localPath
7
дададзена
Фантастычны! Я выкарыстоўваю ня-Баш абалонкі часам і гэта дапамагае бязмерна. Не толькі рэальны шлях, але правільны шлях.
дададзена аўтар Paul B., крыніца

Problem: Copying multiple directories from remote server to local machine using a single SCP command and retaining each directory as it is in the remote server.

Solution: SCP can do this easily. This solves the annoying problem of entering password multiple times when using SCP with multiple folders. Consequently, this also saves a lot of time!

напрыклад

# 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: Motivated by this great answer: scp or sftp copy multiple files with single command


Based on the comments, this also works fine in Git Bash on Windows

5
дададзена
@James Дзякуй, я абнавіў адказ!
дададзена аўтар kmario23, крыніца
Таксама працуе ў Git Bash для Windows.
дададзена аўтар James, крыніца

Заўвага: Загадзя прашу прабачэння за адказы толькі частка гэтага пытання. Тым не менш, я знайшоў гэтыя каманды, каб быць карысным для патрэбаў маёй бягучай Unix.

Загрузка канкрэтных файлаў з лакальнага кампутара на выдаленай машыне:

<�Код> ~/Desktop/dump_files $ УПП file1.txt file2.txt lab1.cpp etc.ext [email protected]: Folder1/DestinationFolderForFiles/

Выгрузка ўвесь каталога з лакальнай машыны на выдаленую машыну:

<�Код> ~ $ УПП -r Desktop/dump_files [email protected]: Folder1/DestinationFolderForFiles/

Загрузка ўсяго каталога з выдаленай машыны на лакальную машыну:

<�Код> ~/Desktop $ УПП -r [email protected]: Public/Web/Desktop/

3
дададзена

ваша каманда працуе выдатна, але я таксама хачу, каб змяніць імя файла пры адпраўцы лакальнай для пульта дыстанцыйнага кіравання. Я напісаў каманду: - sshpass -p пароль УПП /path/to/file.txt корань @ імя хаста: /path/newfile.txt

Але гэта дае памылку, /path/newfile.txt: Няма такога файла ці каталога знойдзены плз дапамагчы мне ў гэтай сітуацыі

2
дададзена
scp remote:"[A-C]/[12].txt" local:
1
дададзена
Так, вы павінны быць у стане зрабіць гэта з -r опцыя Scp . І вы можаце захоўваць іншыя атрыбуты (напрыклад, штамп часу) з -p опцыі.
дададзена аўтар unxnut, крыніца
Ці можаце вы апісаць тыя рэгулярным выразам?
дададзена аўтар unxnut, крыніца
Ці можна захаваць тую ж структуру каталогаў у мэтавым каталогу, выкарыстоўваючы рэгулярныя выразы?
дададзена аўтар user987654, крыніца
дзякуй, але гэта ўсяго толькі прыклад, і фактычны файл або імя каталога з'яўляецца больш складаным. Але ў мяне ёсць спіс з іх.
дададзена аўтар user987654, крыніца

У канкрэтным выпадку, калі ўсе файлы маюць аднолькавае пашырэнне, але з розным суфіксам (скажам, нумар файла часопіса) выкарыстоўваецца наступнае:

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

Гэта будзе капіяваць усе файлы з імем some_log_file з дадзенай тэчкі ў аддаленым, i.e.- some_log_file.1, some_log_file.2, some_log_file.3 ....

Ура,

хлопец

1
дададзена

УПП выкарыстоўвае SSH для перадачы дадзеных з адной і той жа аўтэнтыфікацыяй і забяспечвае такую ​​ж бяспеку як SSH.

Найлепшая практыка тут з'яўляецца ўкараненне «SSH ключ і адкрытым ключом Ідэнтыфікацыі». Пры гэтым, вы можаце напісаць свае скрыпты без worring аб аўтэнтыфікацыі. Просты, як гэта.

See WHAT IS SSH-KEYGEN

1
дададзена

У маім выпадку, я абмежаваны толькі з дапамогай каманды SFTP.
Такім чынам, я павінен быў выкарыстоўваць пакетны файл з SFTP. Я стварыў сцэнар, такія як наступныя. Гэта прадугледжвае, што вы працуеце ў дырэкторыі/TMP, і вы хочаце змясціць файлы ў destdir_on_remote_system на выдаленай сістэме. Гэта таксама працуе толькі з неінтерактівных уваходам. Вам неабходна наладзіць агульнадаступныя/прыватных ключоў, так што вы можаце ўвайсці ў сістэму без уводу пароля. Змяненне ў выпадку неабходнасці.

#!/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]
1
дададзена