scp를 통해 많은 수의 작은 파일을 복사하는 방법은 무엇입니까?


59

몇 기가 바이트와 수천 개의 작은 파일이있는 디렉토리가 있습니다. scp를 사용하여 네트워크를 통해 두 번 이상 복사하고 싶습니다. 원본 및 대상 컴퓨터의 CPU 시간은 저렴하지만 각 파일을 개별적으로 복사하여 추가되는 네트워크 오버 헤드는 엄청납니다. tar / gzip으로 압축하여 배송하지만 소스 시스템의 디스크 용량이 부족합니다.

출력 tar -czf <output> <directory>을 scp 로 파이프하는 방법이 있습니까? 그렇지 않다면 또 다른 쉬운 해결책이 있습니까? 내 소스 머신은 고대 (SunOS)이므로 설치하지는 않겠습니다.

답변:


104

ssh 세션에서 tar를 파이프 할 수 있습니다.

$ tar czf - <files> | ssh user@host "cd /wherever && tar xvzf -"

3
타르 파이프 솔루션 +1 대역폭이 더 많고 CPU가 적 으면 압축 플래그를 제거 할 수 있습니다 (gzip은 매우 가볍지 만).
dietbuddha

2
그리고 압축 플래그를 삭제하고 대신 SSH ( ssh -C또는 Compression yes에서 ~/.ssh/config)로 활성화 할 수 있습니다.
sam hocevar

3
이런 식으로 tar를 사용하는 것을 생각하지 마십시오. 글쎄, 내가 여기 온 이유!
Mr. Shickadance

2
이 명령은 약간 짧게 만들 수 있습니다.$ tar cz <files> | ssh user@host "cd /wherever; tar xvz"
carlito

2
@Greg 대시는 POSIX 호환 소프트웨어에서 컨텍스트에 따라 STDIN 또는 STDOUT을 의미하는 규칙입니다. 첫 번째 대시는 '/ dev / stdin에서 읽음'을 의미하고 두 번째 대시는 실제로 원격 호스트에서 실행되며 '/ dev / stdin'을 의미합니다. 파이프와 ssh는이 두 프로세스를 연결합니다. 자세한 내용은 unix.stackexchange.com/questions/16357/… 을 참조하십시오 .
Richard Metzler 2016 년

22

bzip2 압축을 사용하는 Tar은 네트워크 및 CPU에서 많은 부하를 가져와야합니다.

$ tar -C /path/to/src/dir -jcf - ./ | ssh user@server 'tar -C /path/to/dest/dir -jxf -'

-v화면 출력으로 인해 프로세스 속도가 느려질 수 있으므로 사용하지 마십시오 . 그러나 자세한 출력을 원하면 -jcvf원격 부분이 아닌 tar ( ) 의 로컬 쪽에서 사용하십시오 .

백업 복사본 업데이트와 같은 동일한 대상 경로를 반복해서 복사하는 경우 압축을 사용하는 rsync를 선택하는 것이 가장 좋습니다.

$ rsync -az -e ssh /path/to/src/dir/ user@server:/path/to/dest/dir/

src와 dest 경로는 모두 /로 끝납니다. 또한 의도적으로 -v-P플래그를 사용하지 않고 자세한 출력이 필요한 경우 추가하십시오.


16

를 사용 rsync하면 SSH를 사용합니다.

용법:

rsync -aPz /source/path destination.server:remote/path

rsync 스위치는 압축 및 I- 노드 정보를 관리합니다. -P모든 파일의 진행률을 표시합니다.

을 사용 scp -C하면 압축이 가능하지만 가능하면을 사용하십시오 rsync.


불행히도, 소스 시스템에서 rsync를 사용할 수 없으며 sshd도 아닙니다.
nmichaels

1
클라이언트 시스템에서의 작업에는 sshd가 필요하지 않습니다.
polemon

3

tarssh를 사용하여 양쪽 끝에서 실행할 수 있습니다 . 선한 가족의 scp일부 ssh이므로 아마 양쪽 끝에있을 것입니다.

 8:03AM 12 % tar cf - some_directory | ssh dest_host "tar xf -"

네트워크 트래픽을 줄이기 위해 gzip 또는 bzip2를 파이프 라인으로 작업하는 방법이있을 수 있습니다.


3

@pdo의 대답은 좋지만 버퍼와 압축으로 속도를 높이고 진행률 표시 줄을 추가 할 수 있습니다.

종종 네트워크에 병목 현상이 발생하고 속도가 시간에 따라 변합니다. 따라서 네트워크를 통해 데이터를 보내기 전에 데이터를 버퍼링하는 데 도움이됩니다. 이 작업을 수행하면됩니다 pv.

또한 일반적으로 적절한 압축 알고리즘으로 속도를 높일 수 있습니다. Gzip (위와 같이)은 빠른 압축 알고리즘이지만 일반적으로 zstandard ( zstd) (및 높은 압축 비율의 경우 LZMA / LZMA2 ( xz)는 더 잘 압축되고 동시에 더 빨라집니다.) 새로운 xz 및 zstd에는 이미 내장 된 멀티 코어 지원 기능이 있습니다 코어가 여러 개인 gzip을 사용하려면 pigz를 사용할 수 있습니다.

다음은 네트워크를 통해 진행률 표시 줄, 버퍼링 및 zstandard 압축을 사용하여 데이터를 보내는 예입니다.

tar cf - . | pv -perabs $(du -sk . | cut -f 1)K | zstd -14 --long=31 -T0 | pv -qCB 512M | ssh user@host "cd /wherever && pv -qCB 512M | zstd -cd -T0 --long=31 | tar xf -"

첫 번째 pv는 진행률 ( p ), 예상 시간 ( e ), 전송률 ( r ), 평균 속도 ( a ), 총 전송 된 바이트 ( b )를 표시하는 것입니다. 전체 크기로 추정 du하고 크기 옵션 (추가 ). 압축 및 버퍼링 전에 진행률이 측정되므로 매우 정확하지는 않지만 여전히 유용합니다.

zstd압축 설정 ( 14) 과 함께 사용된다 . 이 숫자는 네트워크 및 CPU 속도에 따라 줄이거 나 늘릴 수 있으므로 zstd는 네트워크 속도보다 약간 빠릅니다. Haswell 3.2GHz CPU 14 에 4 개의 코어가 있으면 약 120MB / s의 속도를 제공합니다. 이 예에서는 긴 모드 31 (2GB 창 사용, 많은 RAM이 필요하지만 데이터베이스 덤프 압축과 같은 매우 좋음)이 사용됩니다. T0의 옵션은 코어 수에 스레드의 양을 설정합니다. 롱 모드와 함께이 설정은 많은 메모리를 사용한다는 것을 알고 있어야합니다.

zstd의 문제점은 대부분의 운영 체제가 버전> 1.3.4와 함께 제공되지 않는다는 것입니다. 이 버전은 적절한 멀티 코어 및 긴 지원에 필요합니다. 사용할 수없는 경우 https://github.com/facebook/zstd 에서 바로 컴파일하여 설치할 수 있습니다 make -j4 && sudo make install. zstd 대신 xz 또는 pigz를 사용할 수도 있습니다. xz는 느리지 만 매우 잘 압축됩니다 (느린 연결보다 양호), pigz / gzip은 빠르지 만 잘 압축되지 않습니다. pv그런 다음 다시 버퍼링에 사용됩니다 ( q조용, C스플 라이스 모드 없음 [버퍼링에 항상 필요] 및 B버퍼 크기 설정).

이 예에서, 버퍼는 수신기 측에서도 사용됩니다. 압축 해제 및 하드 디스크 쓰기 속도가 네트워크 속도보다 대부분 시간이 오래 걸리기 때문에이 작업은 종종 필요하지 않지만 일반적으로 해를 끼치 지 않습니다.


2

양쪽에 gzip이있는 경우 : sourcehost$ cd sourcedir && tar cf - . | gzip -c - | ssh user@destinationhost "cd destinationdir && gzip -c -d | tar xf -"

소스 머신에 gzip이없는 경우 대상을 압축 해제했는지 확인하십시오. sourcehost$ cd sourcedir && tar cf - . | compress | ssh user@destinationhost "cd destdir && uncompress | tar xf -"

이것은 먼저 압축 한 다음 전송 한 다음 압축을 해제하는 것보다 빠르며 양쪽에 추가 디스크 공간이 필요하지 않습니다. 나는 당신이 아마 고대에 그것을 가지고 있지 않기 때문에 tar에 압축 (z) 플래그를 걸렸습니다.


2

또는 필요한 경우 다른 방법으로 할 수 있습니다. 즉, 제안 된 것처럼 타르볼을 네트워크로 밀기보다는 당기십시오. 이것은 귀하의 질문의 반복되는 부분을 해결하지 못하고 rsync가 그에 가장 적합하지만 아마도 tar 스위치가 도움이 될 것입니다.

로컬 컴퓨터에서

ssh remote 'tar zcf - /etc/resolv.conf' | tar zxf -

먼저 올바른 디렉토리에 있거나 마지막에 untaring 명령에서 -C 스위치를 사용해야합니다.

이것이 필요한 경우에 이것을 언급하십시오. 내 상황에서 내 로컬 서버가 nat 뒤에 있기 때문에 이전에 언급 된 방식으로 네트워크를 퍼팅하는 데 약간의 네트워크가 필요합니다.

HTH


1

또는 sshfs를 통해 원격 파일 시스템을 마운트하십시오.

sshfs user@remotehost:/path/on/remote /path/on/local

1

가장 우아하지는 않지만 특히 단일 zip 또는 tar 파일을 복사하지 않고 이중으로 네트워크 ovehead를 줄이는 데 도움이되지 않기 때문에 내 유일한 선택은 다음을 사용하는 것입니다 scp -r.

-r

      전체 디렉토리를 재귀 적으로 복사하십시오. scp 트리 탐색에서 발생하는 심볼릭 링크 를 따릅니다.
출처 : scp (1)

30GB 압축 tar 파일로 디스크 공간 부족 문제가 발생했습니다. gunzip이 인라인을 수행 할 수 있다고 생각했습니다. 즉, 압축이 풀린 상태에서 원본을 제거하면 Google 검색 결과를 놓쳤을 수도 있지만 아무것도 찾을 수 없습니다.

마지막으로, 새로운 TAR 또는 ZIP 파일이 tar 또는 압축을 마칠 때까지 여러 번 시도하는 것에 지 쳤기 때문에 마침내 다음과 같이했습니다.

  1. 원래 서버 / PC / 노트북에서 파일 / 폴더가 많은 폴더가있는 디렉토리로 이동하십시오.
  2. scp -r source_folder_name yourname@yourservername:destination_folder_name

그런 다음 맥주, 커피 또는 팝콘을 들고 기다립니다. 좋은 점은 네트워크 연결이 "중지"되면 scp가 다시 시도한다는 것입니다. 완전히 내려 가지 않기를 바랍니다.


자, 이것은 수천 개의 scp명령을 입력하는 것보다 시간이 덜 걸립니다 . 그러나이 질문은“네트워크 오버 헤드”에 대해 묻습니다. 솔루션에서 각 파일을 개별적으로 복사하는 것보다 적은 양의 네트워크를 사용합니까? 귀하의 솔루션은 이미 게시 된 7 가지보다 우수합니까?
G-남자

Snap, 내 나쁜 점-@ G-Man을 지적 해 주셔서 감사합니다. 나는 대답을 업데이트했는데, 누군가가 내가 가진 것과 비슷한 문제에 걸려 넘어 지고이 질문에 걸려 넘어 졌을 때 여전히 유용 할 수 있다고 생각합니다.
JGlass
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.