최대 압축을 사용하여 TAR로 디렉토리를 XZ하는 방법은 무엇입니까?


116

따라서 최대 압축으로 디렉토리를 압축해야합니다.

어떻게 할 수 xz있습니까? 나는 tar단지로만 디렉토리를 압축 할 수 없기 때문에 나도 필요 하다는 것을 의미한다 xz. 예를 들어 생산할 원 라이너가 foo.tar.xz있습니까?


11
자세한 정보 man 1 xzit's not a good idea to blindly use -9 for everything like it often is with gzip(1) and bzip2(1). -7 ... -9 [...] These are useful only when compressing files bigger than 8 MiB, 16 MiB, and 32 MiB, respectively.RTFM에 따르면 FWIW는 말합니다 .
cychoi

답변:


82

xz압축 레벨 플래그를 포함하여 표준 명령 행 플래그 세트를 사용 한다고 가정하면 다음을 시도 할 수 있습니다.

tar -cf - foo/ | xz -9 -c - > foo.tar.xz 

그리고 이것은 XZ와 함께 최대 압축 수준을 사용합니까?
LanceBaynes 2012 년

3
xz에 -9를 추가하면 최대 값이됩니다.
bsd

23
-9e최고 수준이지만 매우 오래 걸릴 것입니다
Krzysztof Krasoń

-9e항상 최상의 결과를 얻을 수있는 것은 아닙니다. 여기서 8 점 참조 rootusers.com/13-simple-xz-examples
KolonUK

1
또한 --threads=0xz
KolonUK

146

tarbash 또는 파생 쉘에서 최근 GNU 를 사용하는 경우 :

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

tar의 소문자 j 스위치는 bzip을 사용하고 대문자 J 스위치는 xz를 사용합니다.

XZ_OPT환경 변수는 설정할 수 있습니다 xz와 같은 전화 애플리케이션을 통해 전달 될 수 없습니다 옵션을 tar.

이것은 지금 최대 입니다.

참조 man xz설정할 수있는 다른 옵션 ( -e/ --extreme 수있는 몇 가지 데이터 세트에 대한 몇 가지 추가 압축 혜택을 제공).

XZ_OPT=-e9 tar cJf tarfile.tar.xz directory

27
아뇨 그게 요점입니다. 해당 호출에 대해서만 환경 변수를 설정할 수 있습니다. 원하는 경우 내보낼 수 있지만 반드시 그럴 필요는 없습니다.
bsd

2
당신은 그것을 위해 bash 같은 쉘을 가정하고 있습니다.
anddam

7
@anddam, 그것은 Bourne 패밀리의 모든 쉘 (Bourne, ksh, mksh, pdksh, ash, dash, bash, yash, zsh) 및 rc및에서 지원 akanga됩니다. fish, csh, tcshes를 지원하지 않는 주요 쉘 서비스를 제공합니다. 거기에서 env명령을 사용합니다 .
Stéphane Chazelas

1
그래서 모두를 설정 -9하고 -eXZ가의 opts, 당신은 원하는 XZ_OPT=-e9하지만 @krzyk가 지적했듯이, -e입니다 매우 느린
호브

4
단지 기록을 위해 : XZ_OPT은에서 구현 된 기능이 아닙니다 tar. 의 기능입니다 xz. 를 tar호출 xz하면 env-variable이 단순히 전달됩니다.
Sven

14
XZ_OPT=-9e tar cJf tarfile.tar.xz directory

보다 낫다

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

5
이것이 어떻게 더 낫습니까? e 플래그는 무엇을합니까?
cxdf

2
option -e, --extreme컴프레서 또는 디 컴프레서의 메모리 사용량을 늘리지 않고 압축률을 조금 더 향상시킬 수 있도록 압축 프리셋 (-0 ...- 9)을 수정하십시오 (예외 : 프리셋 -0으로 컴프레서 메모리 사용량이 약간 증가 할 수 있습니다 ... -2). 단점은 압축 시간이 크게 증가한다는 것입니다 (쉽게 두 배로 증가 할 수 있음).
Evandro Jr

따라서 내 컴퓨터에서 약 80GB의 소프트웨어를 압축하는 경우 (모든 컴퓨터 리소스가 압축 프로세스로 이동하기를 원할 때) 사용 -9하지 않아야합니다 -9e.
nyxee

1
xz는 기본적으로 1 코어 / 스레드를 사용하므로 XZ_OPT="-9e -T0" tar -cJf ...
-T0

10

16GiB의 RAM이 있고 실행중인 다른 것이없는 경우 다음을 시도해보십시오.

tar -cf - foo/ | xz --lzma2=dict=1536Mi,nice=273 -c - > foo.tar.xz 

압축 해제에는 1.5GiB가 필요하고 압축에 대해서는 약 11 배가 필요합니다. 적은 양의 메모리에 맞게 조정하십시오.

데이터가 실제로 큰 경우에만 도움이되며, 어떤 경우에 도움이되지 않습니다 THAT 여전히 많은,하지만를 ...

바이너리를 압축하는 경우 첫 번째 xz 옵션으로 --x86을 추가하십시오. "멀티미디어"파일 (압축되지 않은 오디오 또는 비트 맵)로 재생하는 경우 --delta = dist = 2 (값이있는 실험, 시도 할만한 값은 1..4)로 시도 할 수 있습니다.

매우 모험적이라고 생각되면 LZMA 옵션을 추가로 사용해보십시오.

--lzma2=dict=1536Mi,nice=273,lc=3,lp=0,pb=2

(이것은 기본 설정이며 0에서 4 사이의 값을 시도 할 수 있으며 lc + lp는 4를 초과해서는 안됩니다)

기본 사전 설정이 이러한 값에 어떻게 매핑되는지 확인하기 위해 소스 파일 src / liblzma / lzma / lzma_encoder_presets.c를 확인할 수 있습니다. 그러나 관심이있는 것은 없습니다 (-e는 멋진 길이를 273으로 설정하고 깊이를 조정합니다).


6

다른 옵션을 시도해 볼 수 있습니다. -4e가 더 잘 작동합니다.

tar cf - wam_GG_${dir}.nc | xz -4e > wam_GG_${dir}.nc.tar.xz 

나는 다음을 실행하여 테스트했다.

$ tar -cf - wam_GG.nc | xz -4e > wam_GG.nc.xz
$ tar -cf - wam_GG.nc | xz -9e > wam_GG.nc.xz.2

따라서 옵션 -4e는 -9e보다 약간 더 효과적입니다.

$ ll wam_GG.nc.xz*
-rw-rw-r--. 1 504 504 2707596 Jan 16  2015 wam_GG.nc.xz
-rw-rw-r--. 1 504 504 2708416 Jan 16  2015 wam_GG.nc.xz.2

3
이것은 실제로 질문에 대답하지 않습니다. 이는 특정 소규모 데이터 세트의 경우 -4e가 이미 최상의 압축을 얻으므로 더 높은 레벨은 더 이상 이점을 얻지 못합니다 (그리고 심지어 약간의 페널티).
psusi

당신은 Szymon Roziewski 와 동일한 사용자 입니까? 그렇다면 여러 답변을 게시하지 마십시오. 대신 원래 답변을 편집하십시오. 첫 번째 계정에 액세스 할 수없는 경우 여기 에서 계정을 병합하는 방법을 참조 하십시오 . 그동안 이전 답변을 삭제하고 여기에 포함시킵니다.
terdon

좋아, 나는 그것에 대해 더 포괄적 인 연구를했다. 내가 가진 것은 여기에 있습니다. hardrive에서 일부 파일을 선택하고 옵션 -4e 및 -9e로 압축했습니다. 따라서 스스로 최상의 솔루션을 찾는 것이 좋습니다. 어떤 경우에는 -9e가 낫지 만 다른 경우에는 그렇지 않습니다.no difference = 660 4e better than 9e = 74 9e better than 4e = 17 total files = 751 tar 2 html 2 csv 2 xml 2 gz 2 ppt 2 eps 2 docx 2 gif 2 rpm 3 png 3 asv 3 xlsx 3 exe 3 rar 4 nc 4 txt 5 odt 6 xls 7 zip 7 doc 9 m 12 dat 17 other 109 pdf 133 135 jpg 270
Szymon Roziewski

(의견은 5 분 동안 만 편집 될 수 있습니다)txt 109 txt/pdf 135
Szymon Roziewski

2
+1. 이는 영업 이익 확인할 수있는 방법 찾을 수 있도록 않습니다 최대 압축 을위한 tar사용하여 파일을 보내고을 xz.
cychoi

5

tar --help : -I, --use-compress-program=PROG

tar -I 'xz -9' -cvf foo.tar.xz foo/  
tar -I 'gzip -9' -cvf foo.tar.gz foo/    

외부 압축기로 압축하십시오.

tar -I 'lz4 -9' -cvf foo.tar.lz4 foo/
tar -I 'zstd -19' -cvf foo.tar.zst foo/

외부 압축기의 압축을 풉니 다 :

tar -I lz4 -xvf foo.tar.lz4  
tar -I zstd -xvf foo.tar.zst  

아카이브 외부 압축기 목록 :

tar -I lz4 -tvf foo.tar.lz4
tar -I zstd -tvf foo.tar.zst

1
이것은 작동하는 대답처럼 보이지만 형식을 고정하고 옵션 -I에 대한 설명을 추가 하면 크게 향상됩니다 .
dhag

4

tar명령은 Jxz 파일에 플래그를 사용 합니다. 예를 들면 :

tar -cJvf foo.tar.xz foo/


2
J이미 bdowning의 대답에 언급 한
안톤

3

관심있는 사람들 은 일반적인 랩톱에 -e9비해 0.4 % 작고 압축시 20 % 느리고 압축 해제시 3 % 느립니다 -9. 다음은 Python 소스 코드 디렉토리 구조에서 실행되는 타이밍입니다.

압축:

$ Tbefore=`date +%s%3N` && XZ_OPT=-9 tar cJf python3.6.tar.9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
43.87
$ Tbefore=`date +%s%3N` && XZ_OPT=-e9 tar cJf python3.6.tar.e9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
53.861

감압 :

$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.395
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.e9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.443

파일 크기 :

$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf Python-3.6.0.tar.xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.49
$ ls -al ?ython*
-rw-rw-r-- 1 hobs hobs 16378500 Dec 23 13:06 python3.6.tar.9xz
-rw-rw-r-- 1 hobs hobs 16314420 Dec 23 13:05 python3.6.tar.e9xz
-rw-rw-r-- 1 hobs hobs 16805836 Dec 23 12:24 Python-3.6.0.tar.xz

1
T0은 다중 스레드 보관을 활성화하는 옵션이므로 잘못된 변수 이름을 선택합니다.
Dzenly

@Dzenly 당신이 맞아요! 감사합니다! 그것을 바꿨다.
호브

2

이것은 귀하의 질문에 대한 정확한 답변은 아니지만 두 가지 대신 하나의 명령을 사용할 수 있습니다.

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1

"ultras ettings"를 사용하여 "dir1"디렉토리의 모든 파일을 archive.7z에 추가합니다.

지원되는 다른 형식은 zip, gzip, bzip2 또는 tar입니다. 이것을 위해 단지 7z후에 교체하십시오 -t.
--출처man 7z

참고 : 하지 않는 백업에이 명령을 사용하여 시스템 파일을 하기 때문에 개인 파일을 제외하고 7Z 포맷은 파일 시스템 권한을 저장하지 않습니다 .


5
문제는 둘 다 LZMA 압축을 사용하더라도 약 7z가 아닌 xz에 관한 것입니다.
Amedee Van Gasse

2

xz-utils 버전 v5.2.0의 멀티 코어 시스템에서 다음을 확인하십시오.

-T, --threads=NUM   use at most NUM threads; the default is 1; set to 0

최대 코어 수와 최대 압축을 사용하려는 경우 :

export XZ_DEFAULTS="-9 -T 0 "

또는 -T를 사용하려는 코어 수로 설정하십시오.

그때:

tar cJf target.tar.xz source

또한 압축 수준을 선택하는 데 유용 할 수 있습니다.

https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


1

여러 스레드를 사용하여이 작업을 더 빨리 완료하고 다른 작업을 수행하는 동안 시스템 속도를 늦추지 -Tn않으려면 n을 사용하려는 스레드 수를 추가 nice하고 압축을 유휴 우선 순위 로 낮추십시오 .

모델 (4 스레드) :

tar c foo/ | nice -n19 xz -9 -T4 > foo.tar.xz

에보고하십시오 top또는 htop당신은 큰 디렉토리 (몇 GB)에서이 작업을 수행 할 때. xzNice 값이 19 (가장 낮은 우선 순위) 인 여러 스레드가 표시되기를 바랍니다 .

: 나는이 아래로 같은, 재치있는만큼 간결 수 벗겨 한 -f -이후, 다른 답변에서 간단하게 필요하지 tar의 기본 출력은 표준 출력입니다.

당신은 할 수 있습니다 nice또한 타르 과정, 그러나 나는, 그것은 필요하다고 적이 xz항상 파이프 라인에 대한 CPU 병목.

실제로, xz -9CPU 나 시간 때문에가 아니라 메모리 요구가 높기 때문에 거의 사용 하지 않습니다. https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO#Memory_requirements_on_compression을 살펴보십시오 . xz압축기와 같은 bzip2, 그러나 달리 gzip, 높은 압축 요소에 대한 더 많은 메모리를 사용한다. xz다른 컴프레서보다 훨씬 많은 메모리 를 사용하면 600MB 이상의 메모리를 쉽게 사용할 수 있습니다. 그리고를 사용하여 -T스레드 압축을 활성화하면 메모리 요구가 더 높아집니다. 1-2GB 메모리의 작은 VM에서 작은 서비스를 실행하는 경우 우연히 영향을 줄 수 있습니다.


1

Mac OS X에서 매개 변수를 전달하는 대체 방법 tar--options=플래그 를 사용하는 것 입니다. 예를 들어

tar Jcvf targetFileName.tar.xz --options='compression-level=9' directoryName
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.