it-swarm-ko.tech

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

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

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

63
nmichaels

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

$ tar czf - <files> | ssh [email protected] "cd /wherever && tar xvzf -"
110
pdo

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

$ tar -C /path/to/src/dir -jcf - ./ | ssh [email protected] 'tar -C /path/to/dest/dir -jxf -'

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

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

$ rsync -az -e ssh /path/to/src/dir/ [email protected]:/path/to/dest/dir/

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

23
forcefsck

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

용법:

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

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

당신이 사용할 수있는 scp -C는 압축을 가능하게하지만 가능하면 rsync를 사용하십시오.

16
polemon

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

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

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

3
Bruce Ediger

@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 [email protected] "cd /wherever && pv -qCB 512M | zstd -cd -T0 --long=31 | tar xf -"

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

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 버퍼 크기).

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

3
Fabian Heller

양쪽에 gzip이있는 경우 : sourcehost$ cd sourcedir && tar cf - . | gzip -c - | ssh [email protected] "cd destinationdir && gzip -c -d | tar xf -"

소스 머신에 gzip이없는 경우 목적지에서 압축을 풀어야합니다. sourcehost$ cd sourcedir && tar cf - . | compress | ssh [email protected] "cd destdir && uncompress | tar xf -"

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

2
MattBianco

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

로컬 컴퓨터에서

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

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

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

HTH

2
DaveQB

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

sshfs [email protected]:/path/on/remote /path/on/local
1
ivanivan

가장 우아하지는 않지만, 특히 하나의 Zip 또는 tar 파일을 복사하지 않고 이중으로 네트워크 ovehead를 줄이는 데 도움이되지 않기 때문에 내 유일한 선택은 scp -r :

-r

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

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

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

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

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

1
JGlass