scp 또는 sftp는 단일 명령으로 여러 파일을 복사합니다


314

다른 디렉토리의 원격 서버와 파일을 복사하고 싶습니다. 예를 들어,이 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

가장 쉬운 방법은 무엇입니까?


14
스크립트를 만들 때 각 명령에 암호를 입력해야했습니다. 피할 수 있습니까?
user987654 2016 년

11
이 방법으로 비밀번호를 반복하지 마십시오. scp remote : "A / 1.txt A / 2.txt B / 1.txt C / 1.txt"local : ./
JohnMudd

stackoverflow.com/a/23748561/874188 (이것의 복제본으로 지명 됨)에는 훌륭한 추가 기술이 있습니다.
tripleee

2
을 살펴 보는 것이 좋습니다 rsync.이 경우와 다가오는 경우에 도움이 될 수 있습니다. 그런 다음 암호를 여러 번 입력하지 않으려면 ssh공개 / 개인 키 에 대해 읽어야 합니다 (예 : digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2
mnagel

1
@JohnMudd의 답변을 기반으로 한 예 : scp root@192.168.56.120:'/etc/openvpn/ca.crt /etc/openvpn/client/client0.crt /etc/openvpn/client/client0.key /etc/openvpn/client/ta.key' ./.
Eduardo Lucio

답변:


420

원격에서 로컬로 여러 파일을 복사하십시오.

$ scp your_username@remote.edu:/some/remote/directory/\{a,b,c\} ./

로컬에서 원격으로 여러 파일을 복사하십시오.

$ scp foo.txt bar.txt your_username@remotehost.edu:~
$ scp {foo,bar}.txt your_username@remotehost.edu:~
$ scp *.txt your_username@remotehost.edu:~

원격에서 원격으로 여러 파일을 복사하십시오.

$ scp your_username@remote1.edu:/some/remote/directory/foobar.txt \
your_username@remote2.edu:/some/remote/directory/

출처 : http://www.hypexr.org/linux_scp_help.php


5
첫 번째 명령은 끝 "."을 생략했으며 '{a, b, c}'는 \ {a, b, c \}와 같습니다.
duleshi

11
OP가 여러 로컬 폴더의 여러 파일을 여러 개의 원격 폴더로 복사하려고한다고 생각합니다.이 예제는 모두 파일을 scp ~하거나 ./단독 으로 수행하기 때문에 작업을 수행하지 않습니다 .
aesede

20
주의 : 중괄호 안에 쉼표 뒤에 공백이 없어야합니다. 방금 명령이 작동하지 않는 이유를 알아 내기 위해 10 분을 보냈습니다. 공백 때문이었습니다.
deepak

13
원격에서 로컬로 복사 할 때 @duleshi {a, b, c}는 \ {a, b, c \}와 정확히 같지 않습니다. 첫 번째는 각 파일의 암호를 요구하고 두 번째는 암호를 한 번만 요구합니다.
Marcelo Ventura

15
@MarceloVentura, @duleshi : 또한 사용 \{a,b,c\}하면 단일 연결 / 배치 (원격 호스트에서 확장되므로)를 사용 {a,b,c}하면 여러 연결이 열리므로 오버 헤드는 많은 파일을 전송할 때 매우 눈에 띄는
omninonsense

140

로컬에서 서버로 :

scp file1.txt file2.sh username@ip.of.server.copyto:~/pathtoupload

서버에서 로컬로 :

scp -T username@ip.of.server.copyfrom:"file1.txt file2.txt" "~/yourpathtocopy"


6
서버가 각 파일 : 암호를 요구하지 않기 때문에 이것은 정상에 대답해야한다
motagirl2

Ubuntu 18 (zsh)에서 클라이언트에서 작동하지 않습니다. 이것이 어디에서 작동하는지 확실하지 않습니다. ```(venv) git : (master) ✗ scp root @ 172.29..xxx.yyy : "/ usr / local / bin / kubectl /root/.kube/config"/ tmp / root @ 172.29..xxx. yyy의 비밀번호 : 프로토콜 오류 : filename이 요청```
jseguillon

3
@ motagirl2 백 슬래시로 중괄호를 이탈하는 한 최상위 답변은 각 파일의 비밀번호를 요구하지 않습니다. 이 답변은 파일을 찾을 수 없다는 오류를 나타냅니다.
명왕성

1
@jseguillon -T해당 오류를 억제하는 옵션을 추가하십시오 .
Monica Reinstate Monica

1
내 컴퓨터에서 만 -T 옵션이없는 두 번째 작품
리처드 DiSalvo

71

-r스위치 를 사용하여 전체 디렉토리를 복사 할 수 있으므로 파일을 자체 디렉토리로 분리 할 수 ​​있으면 모든 것을 한 번에 복사 할 수 있습니다.

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

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

예를 들어

scp -r root@192.168.1.100:/var/log ~/backup-logs

또는 그중 몇 개만있는 경우 다음을 사용할 수 있습니다.

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

내 목적지가 루트이고 다음과 같은 etc 디렉토리를 수행하는 경우 작동합니까? scp -r / backups / etc root @ linuxbox : / 여기서 소스는 "hosts"및 nginx / sites와 같은 매우 드문 디렉토리입니다. -사용 가능한 등?
Tomachi

47

Jiri가 언급했듯이 scp -r user@host:/some/remote/path /some/local/path파일을 재귀 적으로 복사 하는 데 사용할 수 있습니다 . 전송하려는 모든 파일을 포함하는 단일 디렉토리가 있다고 가정합니다.

그러나 SFTP는 여러 개의 다른 디렉토리에서 파일을 전송하려는 경우 대안을 제공하며 대상은 동일하지 않습니다.

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

이것은 "here doc" 구문을 사용하여 일련의 SFTP 입력 명령을 정의합니다. 대안으로 SFTP 명령을 텍스트 파일에 넣고 실행할 수 있습니다.sftp user@host -b batchFile.txt


3
이것은 실제로 질문에 대답하는 유일한 대답입니다. 감사. 나는 scp이 기능을 찾기 위해 너무 오랫동안 인터넷 검색 및 매뉴얼을 분석 해 왔으며 scp에는이 기능이없는 것 같습니다.
sudo

1
이것은 가장 유연하고 유연한 답변입니다. 참고 : 나는 같은 전체 경로를 사용하는 데 필요한 것을 깨달았 때까지가 걸려있어 /home/vagrant/Code/대신 ~/Code/.
Ryan

이것이 가장 좋은 대답 - r입니다. 디렉토리 를 추가하는 것을 잊지 마십시오
Chris_Rands

25

대답은 {file1,file2,file3}bash (원격 또는 로컬)에서만 작동합니다.

진짜 방법은 :

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

1
환상적인! 나는 비 bash 쉘을 때때로 사용하며 이것은 헤아릴 수없이 도움이됩니다. 실제 방법뿐만 아니라 올바른 방법.
Paul B.

1
Globbing with {…, …, …}는 Bash뿐만 아니라 많은 쉘에서 작동합니다. 그러나 이것은 모든 쉘에서 작동하므로 분명히 좋습니다.
Piotr Dobrogost

더 많은 견적이 필요합니다. 이러한 경로에는 공백이 포함될 수 있습니다.
Amit Naidu

1
우리는 거기에 갈! 여러 번 찬성했지만 한 번만 할 수 있습니다! Vouze 감사합니다!
André Pacheco

17

scp를 잠시 사용한 후 가장 강력한 솔루션을 찾았습니다.

(작은 따옴표와 큰 따옴표를주의하십시오)

로컬에서 원격으로 :

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

원격에서 로컬로 :

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

"HOST :"다음에 나오는 것은 원격으로 전송되어 파싱됩니다. 따라서 로컬 셸에서 처리하지 않아야합니다. 작은 따옴표가 나오는 이유입니다. 큰 따옴표는 파일 이름의 공백을 처리하는 데 사용됩니다.

파일이 모두 같은 디렉토리에 있으면 *를 사용하여 다음과 같이 모두 일치시킬 수 있습니다.

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

일부 쉘에서만 지원되는 "{}"구문을 사용하는 것과 비교할 때 이것은 보편적입니다


파일 이름의 공백을 도와 주셔서 감사합니다. {} 접근 방식을 사용했기 때문에 인용 후 \로 이스케이프해야했습니다.
Noumenon

3
경로에서 홈 디렉토리에 물결표 문자 (~)를 사용하려는 경우. ~와 /가 따옴표 밖에 있어야하는 방법에 유의하십시오. ```scp -r robwaa@192.168.1.101 : '~ / "bin / set-vpn-kill-switch"~ / "bin / flush-iptables"'~ / ""`
Rob Waa

{}구문은이 작업을 수행 할 수있는 방법이있다, 쉽게 같은 디렉토리에서 여러 파일을 복사 할 수 있습니다 scp -r즉 있도록 "FILE1" "FILE2"파일에 대한 상대 경로와 절대하지 경로가 될 수는?
dtasev

15

가장 간단한 방법은

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

따라서 {..} 목록은 디렉토리를 포함 할 수 있습니다 (여기서 A, B 및 C는 디렉토리이며 "1.txt"및 "2.txt"는 해당 디렉토리의 파일 이름입니다).

이 네 파일을 모두 하나의 로컬 디렉토리에 복사하지만 원하는 것이 확실하지 않은지 확인하십시오.

위의 경우 파일 이름이 ./1.txt 인 단일 로컬 디렉토리에 복사 된 원격 파일 A / 1.txt, A / 2.txt, B / 3.txt 및 C / 4.txt가 종료됩니다. ./2.txt, ./3.txt 및 ./4.txt


로컬 컴퓨터의 A / 1.txt 내용을 B / 1.txt 내용으로 덮어 쓰지 않습니까?
Yves Dorfsman 2016 년

좋은 지적 .. 조정 된 예 (이제 덮어 쓰지 않음)와 설명이 추가되었습니다. 감사.
Tagar

이와 같은 중괄호 확장은 Bash 기능이며 POSIX와 같이 이식 할 수 없습니다 sh.
tripleee

1
@tripleee, 감사합니다. posix는 아니지만 bash에서만 작동하지는 않습니다. 나는 ksh를 항상 사용하며 거기에서도 작동합니다.
Tagar

1
다음을 수행하여 디렉토리와 파일을 혼합 할 수도 있습니다.local$ scp -r remote:{A/1.txt,A/2.txt,B/3.txt,C/4.txt,D,F} ./
donhector

13

문제 : 단일 SCP 명령을 사용하여 원격 서버에서 로컬 시스템으로 여러 디렉토리를 복사하고 각 디렉토리를 원격 서버에 그대로 유지합니다.

해결책 : SCP는 이것을 쉽게 할 수 있습니다. 이것은 여러 폴더로 SCP를 사용할 때 암호를 여러 번 입력하는 성가신 문제를 해결합니다. 결과적으로 시간도 많이 절약됩니다!

예 :

# 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 username@contact.server.de:/work/datasets/images/test/\{t1,t2,t3\}  .

추신 :이 위대한 대답에 동기 부여 : scp 또는 sftp는 단일 명령으로 여러 파일을 복사합니다.


주석을 기반으로, 이것은 Windows의 Git Bash 에서도 잘 작동합니다.


3
PS는 항목 사이에 공백을 추가하지 않습니다. 즉, \ {T1, T2, T3는 \} ------> 나는 롤 ... 여기 십분 낭비
kenberkeley

1
이것은 중괄호를 피할 때 단일 명령으로 해석되고 각 전송에 대한 비밀번호를 요구하지 않기 때문에 가장 좋은 대답입니다.
Amaynut

@Amaynut 예, 정확히! 그것은 확실히 많은 시간과 노력을 절약합니다 :)
kmario23

12

여러 디렉토리를 복사하십시오.

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

문제는 다른 방법으로 원격 디렉토리에서 로컬 디렉토리로 복사하는 방법이었습니다.
Tagar

5

이 방법으로 할 수 있습니다 :

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

그러면 나열된 모든 파일 이름이 로컬 디렉토리에 다운로드됩니다.

각 파일 이름 사이에 공백을 두지 말고 쉼표 만 사용하십시오 ,.


1
확장명이 같을 때 좋습니다. /path/to/files/\\{file1.ext,file2.ext,file3.ext\\}파일의 확장자가 다른 것처럼 쓸 수 있습니다 . PowerShell 사용자에 대한 참고 사항 (이제 MS가 파티에 참여 `/path/to/files/`{file1.ext,file2.ext,file3.ext`}
했음)

3

참고 : 위의 질문 중 일부에 대해서만 답변 해 주셔서 감사합니다. 그러나이 명령이 현재 유닉스 요구에 유용하다는 것을 알았습니다.

로컬 컴퓨터에서 원격 컴퓨터로 특정 파일 업로드 :

~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext your-user-id@remotemachine.edu:Folder1/DestinationFolderForFiles/

로컬 머신에서 원격 머신으로 전체 디렉토리 업로드 :

~$ scp -r Desktop/dump_files your-user-id@remotemachine.edu:Folder1/DestinationFolderForFiles/

원격 시스템에서 로컬 시스템으로 전체 디렉토리 다운로드 :

~/Desktop$ scp -r your-user-id@remote.host.edu:Public/web/ Desktop/


3

제 경우에는 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 user@host

2

귀하의 명령은 완벽하게 작동하지만 원격으로 로컬을 보내는 동안 파일 이름을 변경하고 싶습니다. 나는 명령을 썼다 :-sshpass -p password scp /path/to/file.txt root @ hostname : /path/newfile.txt

그러나 /path/newfile.txt : 오류가 발생합니다.이 파일에서 plz를 찾지 못했습니다.


원격 디렉토리가 hostname:/path/실제로 존재하고 액세스 가능한지 확인하십시오 .
미트 나이 두

1

scp는 동일한 인증으로 데이터 전송에 ssh를 사용하며 ssh와 동일한 보안을 제공합니다.

여기서 가장 좋은 방법은 "SSH KEYS 및 PUBLIC KEY AUTHENTICATION"을 구현하는 것입니다. 이를 통해 인증에 대한 걱정없이 스크립트를 작성할 수 있습니다. 그렇게 간단합니다.

보다 SSH-Keygen은은 무엇인가


1

모든 파일의 확장자는 동일하지만 접미사 (예 : 로그 파일 수)가 다른 특정 경우 다음을 사용합니다.

scp user_name@ip.of.remote.machine:/some/log/folder/some_log_file.* ./

이것은 원격의 주어진 폴더에서 some_log_file이라는 이름의 모든 파일을 복사합니다 (예 : some_log_file.1, some_log_file.2, some_log_file.3 ....


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

고맙지 만, 이것은 단지 예일 뿐이며 실제 파일 또는 디렉토리 이름은 더 복잡합니다. 그러나 나는 그들의 목록이 있습니다.
user987654 2016 년

정규식으로 설명 할 수 있습니까?
unxnut

정규식을 사용하여 대상 디렉토리에서 동일한 디렉토리 구조를 유지할 수 있습니까?
user987654 2016 년

1
예, -r옵션 으로 할 수 있어야 합니다 scp. -p옵션 으로 다른 속성 (타임 스탬프 등)을 보존 할 수 있습니다 .
unxnut
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.