정식 방법은 무엇입니까?
scp
파일을 원격 위치로- 전송 중인 파일을 압축합니다(
tar
개별 파일이나 전체 폴더7za
또는 기타 더 효율적인 압축). - 중간 파일을 저장하지 않고 위 작업을 수행합니다.
나는 다음과 같은 쉘 파이프에 익숙합니다.
tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z
기본적으로:
- 전체 폴더를 하나로 병합
tar
- 데이터를 압축기
stdout
로 전달stdin
- 적용하다성나게 하기압축
ssh
링크를 통해 이 작업을 수행하고 파일을 원격 파일 시스템에 저장하는 가장 좋은 방법은 무엇입니까?
sshfs
차라리 설치 하지 않는 게 낫겠습니다 .
이것은 작동하지 않습니다:
scp <(tar cvf - MyBackups | 7za a -si -mx=9 -so) localhost:/tmp/tmp.tar.7z
왜냐하면:
/dev/fd/63: not a regular file
답변1
원하는 것을 수행하는 방법에는 여러 가지가 있습니다. 가장 쉬운 방법은 pìpe를 사용하는 것입니다.
tar zcvf - MyBackups | ssh user@server "cat > /path/to/backup/foo.tgz"
여기서 압축은 tar
어떤 호출 gzip
( 플래그)에 의해 z
처리 됩니다. compress
( Z
)와 bzip
( )를 사용할 수도 있습니다 j
. 의 경우 7z
다음을 수행합니다.
tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z |
ssh user@server "cat > /path/to/backup/foo.7z"
이것최고그러나 방법은 rsync
.
Rsync is a fast and extraordinarily versatile file copying tool. It can copy
locally, to/from another host over any remote shell, or to/from a remote rsync dae‐
mon. It offers a large number of options that control every aspect of its behavior
and permit very flexible specification of the set of files to be copied. It is
famous for its delta-transfer algorithm, which reduces the amount of data sent over
the network by sending only the differences between the source files and the exist‐
ing files in the destination. Rsync is widely used for backups and mirroring and
as an improved copy command for everyday use.
rsync
가지다방법선택 사항이 너무 많습니다. 확실히 읽어 볼 가치가 있지만 첫눈에는 무섭습니다. 이 경우 귀하의 우려 사항은 다음과 같습니다.
-z, --compress compress file data during the transfer
--compress-level=NUM explicitly set compression level
-z, --compress
With this option, rsync compresses the file data as it is sent to the desti‐
nation machine, which reduces the amount of data being transmitted --
something that is useful over a slow connection.
Note that this option typically achieves better compression ratios than can
be achieved by using a compressing remote shell or a compressing transport
because it takes advantage of the implicit information in the matching data
blocks that are not explicitly sent over the connection.
따라서 귀하의 경우 다음과 같은 것을 원할 것입니다.
rsync -z MyBackups user@server:/path/to/backup/
파일은 전송 중에 압축되고 대상에 도달하면 압축이 풀립니다.
더 많은 선택:
scp
데이터 자체를 압축할 수 있음-C Compression enable. Passes the -C flag to ssh(1) to enable compression. $ scp -C source user@server:/path/to/backup
rsync
어쩌면 당신이 친절 해질 수 있는 방법이 있을 수도 있지만7za
, 그렇게 하는 것은 아무 소용이 없습니다. 이 방법의 장점rsync
은 로컬 파일과 원격 파일 간에 변경된 비트만 복사한다는 것입니다. 그러나 로컬의 작은 변경으로 인해 압축 파일이 매우 달라질 수 있으므로 사용할 필요가 없습니다rsync
. 그것은 일을 복잡하게 만들고 아무 소용이 없습니다.ssh
위 그림처럼 직접 사용하시면 됩니다 . 만약 너라면진짜이렇게 하려면 하위 쉘을 인수로 전달해 보십시오rsync
. 내 시스템에서는7za
압축된 데이터를 터미널에 쓸 수 없기 때문에 사용할 수 없습니다 . 구현이 다를 수도 있습니다. 다음과 같은 것을 시도해 보십시오(이건 나한테는 안 맞는다):rsync $(tar cf - MyBackups | 7za a -an -txz -si -so) \ user@server:/path/to/backup
또 다른 점은
7z
Linux의 백업에는 사용하면 안 됩니다.. 매뉴얼 페이지에 다음과 같이 나와 있습니다7z
.다음과 같은 이유로 Linux/Unix 백업에는 7-zip 형식을 사용하지 마십시오.
- 7-zip은 파일 소유자/그룹을 저장하지 않습니다.
답변2
내 생각엔 이 명령이 효과가 있을 것 같아
ssh user@host "cd /path/to/data/;tar zc directory_name" | tar zx
이제 먼저 대상 호스트에서 이 명령을 실행해야 합니다. 그리고 설명이 필요한 세부 사항은 다음과 같습니다.
- ssh user@host는 호스트에 대한 연결을 열고 호스트에서 데이터를 전송합니다.
- cd /path/to/data는 필요한 데이터가 저장된 디렉토리로 들어갑니다.
- tar zc *는 압축을 시작하고 이를 STDOUT에 넣습니다.
- 이제 파이프(|)는 소스의 STDOUT을 "tar zx"를 실행하는 대상의 STDIN으로 파이프하고 소스의 데이터 스트림을 지속적으로 압축 해제합니다.
보시다시피, 이 명령은 즉시 대역폭을 압축하고 저장합니다. 더 나은 결과를 얻기 위해 다른 압축을 사용할 수도 있지만 압축 및 압축 해제에는 CPU 주기가 필요하다는 점을 명심하세요.
답변3
작은 개선dkbhadeshiya의 답변: 이 작업을 수행할 필요는 없으며 cd dir
작업 디렉토리를 지정하기만 하면 됩니다 tar
.
ssh user@host "tar -C /path/to/data/ -zc directory_name" | tar zx
같은 방법으로 디렉터리를 업로드할 수도 있습니다.
tar zc directory_name/ | ssh user@host "tar zx -C /new/path/to/data/"