tar -zcvf를 사용할 때 압축 수준을 지정하는 방법은 무엇입니까?


142

나는 직장에서 매우 자주 디렉토리를 압축한다. 내가 보통하는 것은

tar -zcvf file.tar.gz /path/to/directory

압축 수준을 지정하는 방법이 있습니까? 압축하는 데 더 많은 시간이 걸리더라도 가능한 최고의 압축을 사용하고 싶습니다.

답변:


142
GZIP=-9 tar cvzf file.tar.gz /path/to/directory

bash를 사용한다고 가정합니다. 일반적으로 GZIP 환경 변수를 "-9"로 설정하고 tar를 정상적으로 실행하십시오.

또한 최고의 압축을 원한다면 gzip을 사용하지 마십시오. lzma 또는 7z를 사용하십시오.

그리고 gzip을 사용할 때 (여러 가지 이유로 좋은 아이디어입니다)는 pigz아닌 프로그램 사용을 고려 하십시오 gzip.


14
pigz는 gzip 압축을 위해 모든 코어를 사용하는 "병렬 gzip"입니다. top200 % -400 $ CPU 사이의 어느 곳에서나 보고 볼 수 있습니다 .
Felipe Alvarez

2
참고로 .bz2 형식의 경우 BZIP2 = -9 tar cvjf file.tar.bz2 / path / to / directory
Tomofumi

3
환경 변수는 이제 것처럼 보이며 GZIP_OPT사용법은 동일해야합니다.
Seer

3
gzip 용 Ubuntu 16.04 매뉴얼 페이지에서 : "Vax / VMS에서 환경 변수의 이름은 GZIP_OPT이며 프로그램 호출을 위해 설정된 기호와 충돌하지 않습니다." 쉬, CSH 및 MS-DOS의 경우는 여전히해야 GZIP
Ponyboy47

68

tar에 gzip 플래그를 사용하는 대신 tar 프로세스 후에 파일을 수동으로 gzip으로 압축 한 다음 gzip 프로그램의 압축 레벨을 지정할 수 있습니다.

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

또는 다음을 사용할 수 있습니다.

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

gzip 명령 줄의 -9는 gzip에게 가능한 최대 압축 수준을 사용하도록 지시합니다 (기본값은 -6).

편집 : @depesz 주석을 기반으로 고정 파이프 명령 줄.


4
파이프를 사용하여 다음을 수행해야합니다.tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

1
첫 번째 예제는 ".gz"확장자를 추가 file.tar하므로로 끝나야 gzip합니다.
bonsaiviking

4
왜 건너 뛰지 f -않습니까? 어떤 파일이없는 경우, 다음은 표준 입력 / 출력입니다
akostadinov

사전 의견에 추가. "man tar"섹션에서 환경 : TAPE --file이 지정되지 않은 경우 아카이브에 사용할 장치 또는 파일입니다. 이 환경 변수가 설정되지 않은 경우 stdin 또는 stdout을 대신 사용하십시오.
Mikl

2
"gzip -9-"-> "gzip -9"를 줄일 수 있습니다. "man gzip"섹션에서 설명 : 파일이 지정되지 않았거나 파일 이름이 "-"인 경우 표준 입력이 표준 출력으로 압축됩니다.
Mikl

53

최신 버전의 tar는 xz 아카이브 형식 ( 2009 년 1.22 이후 GNU tar, 2010 년 1.17.0 이후 Busybox )을 지원합니다.

lzma2 기반으로 gz7-Zip 버전 과 비슷합니다 . xz 지원이 필요한 경우 압축 성능이 향상됩니다.

tar -Jcvf file.tar.xz /path/to/directory

방금 여기 (기본적 으로이 질문의 속임수이지만 Unix stackexchange에서) 다른 게시물의 GZIP와 유사한 XZ 압축 수준을 제어하는 ​​XZ_OPT = -9 환경 변수도 있음을 알았습니다.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

2
+1 xz는 bzip2와 gzip보다 훨씬 낫습니다. 다음은 비교입니다 : tukaani.org/lzma/benchmarks.html
User1

8
절충은 속도입니다. XZ는 상당히 느립니다.
Bell

32
tar cv /path/to/directory | gzip --best > file.tar.gz

이것이 Matrix Mole의 두 번째 솔루션이지만 약간 단축되었습니다.

tar를 호출 할 때 옵션 f은 출력이 파일임을 나타냅니다. 그것을 -(stdout)으로 설정 하면 tar는 출력을 stdout에 쓰게되는데 이것은 fand와 둘 다없는 기본 동작 -입니다.

gzip매뉴얼 페이지에 명시된 바와 같이 파일이 지정되어 있지 않으면 gzip은 표준 입력에서 압축됩니다. 필요가 없습니다 -gzip호출.

옵션 --best(과 동일 -9)은 최고 압축 수준을 설정합니다.


1
이것은 아름답게 작동합니다. 또한 루트 권한으로 실행하면 권한 및 소유자도 보존됩니다. 그렇지 않으면 지정해야합니다. 또한 명확하지 않은 경우 "-9"는 최상의 압축이고 "-1"은 가장 빠른 압축입니다. 파일이 많으면 "-1"이 여전히 시간이 많이 걸립니다 ;-)
PJ Brunet

이것은 작동 xzpixz도. 중간 .tar 파일을 만들지 않고도 병렬 압축에 사용되는 스레드 수를 제어하는 ​​좋은 방법입니다. 그렇게tar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom

10

-I를 사용하여 압축 프로그램을 지정하는 옵션도 있습니다. 압축 수준 옵션이 포함될 수 있습니다.

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory

2
CentOS 6 및 7에서 제공되는 것과 같은 이전 버전의 tar는 인수에 인수를 제공하는 것을 지원하지 않으므로 -I전체를 프로그램 이름으로 실행하여 실패합니다. 데비안 스트레치에서 적어도 tar 1.29부터는 작동합니다.
치타

2

물론 macOS bsd 파생 tar는 달라야합니다.

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.