많은 압축 파일을 하나의 아카이브로 결합하려면 어떻게해야합니까?


10

.tar.xz거의 동일한 수백 개의 파일이 있습니다 (매일 데이터베이스 덤프이며 데이터베이스가 느리게 변경됩니다).

압축되지 않은 파일의 유사성으로 인해 압축률이 매우 높으며 소규모 테스트에서 이러한 압축되지 않은 파일을 압축하면 하나보다 약간 큰 아카이브가 생성되는 것으로 나타났습니다.

내 문제는 압축되지 않은 모든 파일이 몇 테라 바이트 (압축률은 약 25 : 1)이며 작업 영역으로 사용할 디스크 공간이 부족하다는 것입니다.

개별 압축 파일을 한 번에 하나씩 처리하여 단일 아카이브에 추가하고 함께 압축 할 때의 이점을 유지하는 방법이 있습니까?


하나의 파일을 압축 해제하고 모든 파일을 주어진 아카이브에 추가 한 후 다음 파일로 이동하도록 스크립팅을 시도 했습니까?
darnir

답변:


10

tar 파일은 스트리밍 형식이므로 cat두 파일을 함께 사용하여 거의 정확한 결과를 얻을 수 있습니다. 이렇게하려면 디스크로 추출 할 필요가 없습니다. 파일의 압축을 풀고 (만) 함께 연결 한 다음 해당 스트림을 다시 압축 할 수 있습니다.

xzcat *.tar.xz | xz -c > combined.tar.xz

combined.tar.xz구성 요소 tarball에있는 모든 파일의 압축 된 tarball이 약간 손상됩니다. 압축을 풀려면 결과 중간에 "파일 끝"마커가 표시되므로 --ignore-zeros옵션 (GNU에서 tar) 을 사용해야합니다 . 그러나 그 외에는 모든 것이 올바르게 작동합니다.

GNU tar는 또한 --concatenate결합 된 아카이브를 생성하기위한 모드를 지원합니다 . 위와 같은 제한 사항이 있습니다 --ignore-zeros. 추출 하는 데 사용해야 하지만 압축 된 아카이브에서는 작동하지 않습니다. 프로세스 대체를 사용하여 작동하도록 속일 수는 있지만 번거롭고 훨씬 더 취약합니다.

다른 tar 파일에 두 번 이상 나타나는 파일이 있으면 제대로 작동하지 않지만 문제는 없습니다. 그렇지 않으면 원하는 결과를 얻을 수 있습니다. 출력을 파이핑하는 xz방법 은 출력을 tar압축 하는 방법 입니다.


특정 tar구현 에서만 작동하는 아카이브가 귀하의 목적에 적합하지 않은 경우, 다음과 함께 아카이브에 추가 r하십시오.

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    mkdir tmp
    pushd tmp
    tar xJf "../$x"
    tar rJf ../combined.tar.xz .
    popd
    rm -r tmp
done

이것은 한 번에 하나의 아카이브 만 추출하므로 작업 공간은 단일 아카이브의 컨텐츠 크기로 제한됩니다. 압축은 최종 아카이브를 한 번에 만들었을 때와 마찬가지로 스트리밍되므로 그 어느 때보 다 좋을 것입니다. cat버전 보다 속도를 느리게 만드는 초과 압축 해제 및 재 압축을 많이 수행 하지만 결과 아카이브는 특별한 지원없이 어디에서나 작동합니다.

정확히 원하는 것에 따라 압축되지 않은 tar 파일 자체를 아카이브에 추가하면 충분할 수 있습니다. 단일 파일에서 내용뿐만 아니라 거의 (거의) 압축하고 각 파일의 압축 오버 헤드를 줄입니다. 이것은 다음과 같습니다.

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    xz -dk "$x"
    tar rJf combined.tar.xz "${x%.xz}"
    rm -f "${x%.xz}"
done

스트림에 추가 tar 헤더가 있기 때문에 최종 압축 크기 측면에서 약간 덜 효율적이지만 모든 파일을 파일로 추출하고 다시 추가하는 데 시간이 절약됩니다. 당신은 끝낼 것 combined.tar.xz많은 (비 압축)를 포함하는 db-*.tar파일을.


고마워, 두 번째 옵션은 내 목적에 맞아 보이지만 마지막 단락을 자세히 설명 할 수 있습니까? 이것은 어떻게 생겼습니까?
jl6

@ jl6 : 편집을 참조하십시오.
Michael Homer

죄송합니다.이 테스트 만 할 수있었습니다. 두 번째 방법은이 오류를 tar: Cannot update compressed archives
나타냅니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.