가장 쉬운 방법은 전체 아카이브를 복사하는 것입니다. 나는 그것이 너무 커서 그렇게하고 싶지 않다고 가정합니다.
일반적인 명령 줄 도구 ( tar
, pax
)는 아카이브 멤버를 다른 아카이브로 복사하는 것을 지원하지 않습니다.
소유권을 유지할 필요가 없다면 FUSE 파일 시스템을 사용하는 것이 좋습니다 . archivemount 를 사용 하여 아카이브를 파일 시스템으로 마운트 할 수 있습니다 . 소스 아카이브에 대해이를 수행하고 마운트 된 파일 시스템에서 tar를 실행하십시오.
archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt
또는 AVFS 를 사용할 수 있습니다 .
mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz
또는 tar
원본 아카이브에서 실행 하고 SSHFS를 통해 원격 시스템으로 추출 할 수 있습니다 .
sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt
그러나 소유권을 보존해야하는 경우 이러한 모든 방법이 번거 롭습니다. 모두 로컬 시스템의 파일로 추출하는 과정을 포함하므로이 파일의 소유권은 의도 한 원격 소유권 이어야합니다 . 루트로 실행해야하며 로컬 시스템과 원격 호스트간에 이름이나 ID가 다른 계정이 파일을 소유 한 경우 의도 한 결과를 얻지 못할 수 있습니다.
파이썬 tarfile
라이브러리는 타르 멤버를 조작하는 상당히 쉬운 방법을 제공하므로, 하나의 타르 파일에서 다른 타르 파일로 셔플 할 수 있습니다. POSIX 표준 형식 (ustar, pax) 및 일부 GNU 확장을 지원합니다. 다음은 표준 입력에서 tar 파일 (gzip 또는 bzip2로 압축 됨)을 읽고 bzip2로 압축 된 tar 파일을 표준 출력에 쓰는 테스트되지 않은 Python 스크립트입니다. 소스의 멤버는 스크립트에 전달 된 인수로 시작하면 복사됩니다.
#!/usr/bin/env python2
import sys, tarfile
source = tarfile.open(fileobj=sys.stdin)
destination = tarfile.open(fileobj=sys.stdout, mode='w:bz2')
for info in source:
if info.name.startswith(sys.argv[1]):
destination.addfile(info)
destination.close()
로 호출
tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj
@original.tar
접근법이 bsdtar로 가능하다는 것을 몰랐습니다. 확장 된 속성 및 압축에서도 작동하는 것 같습니다</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(어떤 이유로 빈 선택은 일련의 0 바이트를 생성하지만 큰 문제는 아닙니다).