하나의 명령으로 scp를 통해 여러 파일을 복사하는 방법은 무엇입니까?


20

한 PC에서 다른 PC로 많은 파일을 전송해야합니다 (두 Linux 모두). 나는 그것을 사용 scp하고 싶지만 scp한 번에 하나의 파일 만 전송할 수 있습니다.

어떻게해야합니까?

나는 가지고있다

  • rsync 또는 다른 프로토콜을 사용할 수 없음
  • 암호가없는 인증서를 사용할 가능성이 없습니다 (그러나 암호가있는 인증서가있는 경우)
  • 전송할 파일 목록 및 다른 서버에있는 파일의 대상 경로가있는 목록
  • 파일은 많은 디렉토리에 분산되어 있으며 복사하려는 디렉토리의 모든 파일이 아닙니다.

가능한 경우 대역폭을 절약하기 위해 투명하게 gzip 및 ungzip을 사용하고 싶습니다!

이게 가능해?

답변:


31

사용 tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -

2
파일 형식은 다음과 같습니다. "c 모드에서 tar는 파일 이름에서 아카이브 할 이름을 읽습니다. 특수 이름 -C'' on a line by itself will cause the current directory to be changed to the directory specified on the following line. Names are terminated by newlines unless --null is specified. Note that --null also disables the special handling of lines containing -C ''."
Kousha

14

scp를 사용하고 싶지만 scp는 한 번에 하나의 파일 만 전송할 수 있습니다.

적어도 scp대부분의 Linux 배포판에 포함 된 OpenSSH가 제공 하는 명령에 대해서는 사실이 아니라고 확신합니다 .

나는 scp file1 file2 ... fileN user@host:/destination/directory/상당히 자주 사용 합니다.

투명한 압축을 위해 SSH 프로토콜에는이 기능이 내장되어 있으며 명령 행에 옵션을 scp제공하면이를 사용할 수 있습니다 -C. 비슷한 작은 파일이 많으면 akira가 제안한 tar + gz 옵션이 scp각 파일을 별도의 엔티티로 압축하는 파일 간의 유사성을 사용할 수 있으므로 더 나은 압축을 얻을 수 있습니다 . 나는 일반적으로 scp를 사용하는 것을 선호하지만 부분 전송을 재개하는 것이 더 쉽기 때문에 (또는이 상황에서 질문자가 옵션을 가지고 있지 않다는 것을 알고 있지만) rsynctar + gz 옵션의 전체를 다시 시작하고 공유하는 것이 더 쉽기 때문에 스트림 압축 장점.


이것은 정답이지만 실제로는 한 번에 하나의 파일 만 전송합니다. 그럼에도 불구하고 사용 가능한 대역폭을 최대한 활용하고 가능한 빨리 실행해야합니다.
Benjamin Bannier

4

scp -r yourdir otherhost:/otherdir작동 하지 않습니까?

이것을 시도하십시오 :

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

z타르에 -flag 압축을 수행합니다. 또는 -C를 사용하여 ssh를 사용할 수 있습니다.

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"

무엇을 -C합니까?
Nathan Fellman

1
문제는 파일 목록이 있다는 것입니다. 파일은 많은 디렉토리에 분산되어 있으며 복사하려는 디렉토리의 모든 파일이 아닙니다.
Peter Smit

2
@Nathan : -C는 압축을 수행하도록 설정합니다.
Jimmy Hedman

1

RHEL5에서는 특수 문자 (공백과 같은)가 포함 된 파일 목록을 안전하게 복사 할 수있는 유일한 방법이 있습니다. 쉘 스크립트를 작성하고 다음을 포함하십시오.

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE

0

많은 문제없이 할 수 있습니다.

각 파일 옆에 호스트 이름으로 파일 목록을 만들고 scp가 잘 파싱하는 것처럼 보입니다. 즉.

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

Scp는이 구문으로 잘 작동하는 것 같습니다. 각 파일 옆에 호스트 이름없이 시도했지만 첫 번째 파일 다음에 실패했습니다. 나는 이것에 대해 이전에 사용한 또 다른 구문을 회상하고 그것을 찾으면 게시 할 것입니다.


이 방법은 효과가 있지만 속도가 느립니다. 각 파일에 대한 연결을 시작하는 것 같습니다 ... (저속 복사 솔루션을 찾기 위해 여기에 왔습니다 ...) ~/대부분 제외 할 수 있습니다. SCP는 홈 디렉토리를 기준으로 작동합니다. .. 다른 곳의 목록이있는 경우 $list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination(공백이있는 파일 이름은 중단됩니다)
Gert van den Berg

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.