공간을 절약하기 위해 여러 단계에서 분할 tar 아카이브를 만드는 방법은 무엇입니까?

Jan 08 2021

tar 아카이브를 만들려는 매우 큰 폴더가 있습니다. 문제는 전체 아카이브를 저장할 충분한 여유 공간이 없기 때문에 한 번에 100-200GB의 아카이브 청크를 생성하고 개별적으로 클라우드 스토리지로 전송하고 싶습니다. 새 청크가 생성되는시기를 제어 할 수 있어야 HDD가 꽉 차지 않지만 분할 타르볼을 생성하기 위해 찾은 모든 명령은 항상 동일한 디렉토리에 한꺼번에 생성합니다.

내가 찾은 가장 가까운 해결책은 이 질문에서 나왔지만 모든 응답은 파일 크기가 고르지 않게 분산되어 있으므로 사용 사례에 중요한 크기가 아닌 파일 수를 기준으로 아카이브를 기반으로합니다.

답변

2 EduardoTrápani Jan 08 2021 at 10:09

tar다음 옵션을 사용하여을 사용할 수 있습니다.

--new-volume-script=COMMAND
--tape-length=N

각 볼륨의 끝에서 스크립트를 호출하여 방금 처리 된 볼륨을 알 수있는 환경 변수가 있습니다. 전체 목록 은 매뉴얼 페이지 를 확인하십시오 . 그러나 출력 파일의 이름을 바꾸거나 현재 볼륨을 추적해야하는 경우 최소한 TAR_VOLUME 변수가 매우 유용합니다.

TAR_VOLUME tar가 처리중인 볼륨의 서수입니다 (다중 볼륨 아카이브를 읽는 경우 설정 됨).

스크립트 반환 0 tar이 계속되면 중지됩니다.

예를 들어, 이렇게하면 최대 크기가 20M 인 각 볼륨이 생성되고 제한에 도달 할 때마다 스크립트를 호출합니다.

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=/path/to/myscript.sh --tape-length=20M

스크립트는 간단 echo "Next volume";read할 수도 있고 전송을 수행 할 수도 있습니다 (종료 /tmp/volume.tar하면 덮어 쓰기 때문에 볼륨 이름 변경 ).

다른 쪽에서는 --multi-volume 플래그를 사용해야합니다. 그렇지 않으면 tar가 오류와 함께 중지됩니다 (누군가 오류를 검색 할 경우를 대비하여 남겨 둡니다).

tar : 아카이브의 예상치 못한 EOF

tar : 오류를 복구 할 수 없습니다. 지금 종료합니다.

tar xvf /path/to/transferred.volume --multi-volume

/path/to/transferred.volume에 대한 볼륨 # 2를 준비하고 리턴을 누르십시오.

tar새 볼륨을 입력하라는 메시지가 표시됩니다. Enter 키를 누르면 /path/to/transferred.volume다시 열립니다.

1 JoshHarrison Jan 09 2021 at 01:30

eduardo-trápani의 훌륭한 답변 에 이어 다음 은 GNU 페이지 에서 찾은 스크립트의 약간 수정 된 버전으로 각 볼륨에 대한 사용자 입력을 기다리고 볼륨이 없으면 다시 시도합니다.

완전성을 위해 다음은 아카이브를 만드는 데 사용되는 명령입니다.

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=./myscript.sh --tape-length=1000M

그리고 이것은 분할 아카이브를 추출하는 데 사용한 명령입니다.

tar xvf /tmp/volume.tar --multi-volume --new-volume-script=./myscript.sh

myscript.sh :

#!/bin/bash
# For this script it's advisable to use a shell, such as Bash,
# that supports a TAR_FD value greater than 9.

echo "Press enter to continue to next volume"

read

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.

name=`expr $TAR_ARCHIVE : '\(.*\)-.*'` case $TAR_SUBCOMMAND in
-c)       ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || echo "Failed to find volume" ;; *) exit 1 esac echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD

편집 : 이것은 macOS (w / Homebrew)에 다음과 같은 방법으로 설치할 수있는 GNU Tar에서만 작동합니다.

brew install gnu-tar

기본 tar로 사용하려면 다음과 같이 경로에 추가해야합니다.

export PATH="$(brew --prefix)/opt/python/libexec/bin:$PATH"