답변:
xz
압축 레벨 플래그를 포함하여 표준 명령 행 플래그 세트를 사용 한다고 가정하면 다음을 시도 할 수 있습니다.
tar -cf - foo/ | xz -9 -c - > foo.tar.xz
-9e
최고 수준이지만 매우 오래 걸릴 것입니다
-9e
항상 최상의 결과를 얻을 수있는 것은 아닙니다. 여기서 8 점 참조 rootusers.com/13-simple-xz-examples
--threads=0
xz
tar
bash 또는 파생 쉘에서 최근 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
rc
및에서 지원 akanga
됩니다. fish
, csh
, tcsh
과 es
를 지원하지 않는 주요 쉘 서비스를 제공합니다. 거기에서 env
명령을 사용합니다 .
-9
하고 -e
XZ가의 opts, 당신은 원하는 XZ_OPT=-e9
하지만 @krzyk가 지적했듯이, -e입니다 매우 느린
XZ_OPT
은에서 구현 된 기능이 아닙니다 tar
. 의 기능입니다 xz
. 를 tar
호출 xz
하면 env-variable이 단순히 전달됩니다.
XZ_OPT=-9e tar cJf tarfile.tar.xz directory
보다 낫다
XZ_OPT=-9 tar cJf tarfile.tar.xz directory
option -e, --extreme
컴프레서 또는 디 컴프레서의 메모리 사용량을 늘리지 않고 압축률을 조금 더 향상시킬 수 있도록 압축 프리셋 (-0 ...- 9)을 수정하십시오 (예외 : 프리셋 -0으로 컴프레서 메모리 사용량이 약간 증가 할 수 있습니다 ... -2). 단점은 압축 시간이 크게 증가한다는 것입니다 (쉽게 두 배로 증가 할 수 있음).
-9
하지 않아야합니다 -9e
.
XZ_OPT="-9e -T0" tar -cJf ...
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으로 설정하고 깊이를 조정합니다).
다른 옵션을 시도해 볼 수 있습니다. -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
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
txt 109 txt/pdf 135
tar
사용하여 파일을 보내고을 xz
.
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
-I
에 대한 설명을 추가 하면 크게 향상됩니다 .
관심있는 사람들 은 일반적인 랩톱에 -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
이것은 귀하의 질문에 대한 정확한 답변은 아니지만 두 가지 대신 하나의 명령을 사용할 수 있습니다.
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 포맷은 파일 시스템 권한을 저장하지 않습니다 .
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
또한 압축 수준을 선택하는 데 유용 할 수 있습니다.
여러 스레드를 사용하여이 작업을 더 빨리 완료하고 다른 작업을 수행하는 동안 시스템 속도를 늦추지 -Tn
않으려면 n을 사용하려는 스레드 수를 추가 nice
하고 압축을 유휴 우선 순위 로 낮추십시오 .
모델 (4 스레드) :
tar c foo/ | nice -n19 xz -9 -T4 > foo.tar.xz
에보고하십시오 top
또는 htop
당신은 큰 디렉토리 (몇 GB)에서이 작업을 수행 할 때. xz
Nice 값이 19 (가장 낮은 우선 순위) 인 여러 스레드가 표시되기를 바랍니다 .
: 나는이 아래로 같은, 재치있는만큼 간결 수 벗겨 한 -f -
이후, 다른 답변에서 간단하게 필요하지 tar
의 기본 출력은 표준 출력입니다.
당신은 할 수 있습니다 nice
또한 타르 과정, 그러나 나는, 그것은 필요하다고 적이 xz
항상 파이프 라인에 대한 CPU 병목.
실제로, xz -9
CPU 나 시간 때문에가 아니라 메모리 요구가 높기 때문에 거의 사용 하지 않습니다. 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에서 작은 서비스를 실행하는 경우 우연히 영향을 줄 수 있습니다.
man 1 xz
는it'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는 말합니다 .