아카이브 파일 목록을 즉시 인쇄합니다(전체 아카이브의 압축을 풀지 않고).

아카이브 파일 목록을 즉시 인쇄합니다(전체 아카이브의 압축을 풀지 않고).

아카이브의 한 가지 문제점 .tar.gz은 아카이브의 내용을 나열하려고 할 때 컴퓨터가 실제로 압축을 풀기 때문에 파일이 큰 경우 시간이 오래 걸릴 수 있다는 것입니다.

.7z, .rar, 등의 다른 파일 형식에는 .zip이 문제가 없습니다. 내용을 나열하는 데는 몇 분밖에 걸리지 않습니다.

제 생각에는 이것이 .tar.gz아카이브 형식의 큰 단점입니다.

그래서 실제로 두 가지 질문이 있습니다.

  1. .tar.gz이러한 단점에도 불구하고 사람들은 왜 여전히 그것을 그렇게 많이 사용합니까?
  2. "인스턴트 콘텐츠 목록" 기능을 원하는 경우 어떤 옵션이 있습니까?(다른 소프트웨어나 도구를 의미합니다)

답변1

여기에는 절충안이 있다는 것을 이해하는 것이 중요합니다.

tar방법테이프 아카이버. 테이프에서는 주로 순차 읽기 및 쓰기를 수행합니다. 테이프는 오늘날 거의 사용되지 않지만 tar스트리밍 형식으로 데이터를 읽고 쓰는 기능을 위해 여전히 사용됩니다.

넌 할 수있어:

tar cf - files | gzip | ssh host 'cd dest && gunzip | tar xf -'

zip그런 일이나 그런 일은 할 수 없습니다 .

zip먼저 로컬에서 검색 가능한 파일에 저장하지 않고는 아카이브의 내용을 나열할 수도 없습니다. 그림:

curl -s https://github.com/dwp-forge/columns/archive/v.2016-02-27.zip | unzip -l /dev/stdin

불가능한.

콘텐츠를 빠르게 읽으려면 zip색인 생성이 필요합니다. 인덱스는 파일 시작 부분(이 경우 스트림이 아닌 일반 파일에만 쓸 수 있음)이나 파일 끝 부분에 저장될 수 있습니다. 즉, 아카이버는 인쇄하기 전에 모든 아카이브를 기억해야 함을 의미합니다. 이는 잘린 아카이브를 복구할 수 없음을 의미합니다.

이는 또한 아카이브 구성원을 개별적으로 압축해야 함을 의미하며, 이는 특히 작은 파일이 많은 경우 압축 비율이 훨씬 낮다는 것을 의미합니다.

유사한 형식의 또 다른 단점은 zip보관이 압축과 관련되어 있으며 압축 알고리즘을 선택할 수 없다는 것입니다. ( ), , 을 차례로 사용한 다음 새로운 tar고성능 압축 알고리즘을 설계하여 아카이브를 압축하는 방법을 알아보세요 . 암호화도 마찬가지입니다. 오늘날 누가 암호화를 신뢰합니까 ?compresstar.Zgzipbzip2xzzip

이제 아카이브의 문제 tar.gz는 압축을 풀어야 한다는 것이 아닙니다. 압축 해제는 일반적으로 디스크에서 읽는 것보다 빠르지만(대규모 tgz 아카이브의 콘텐츠를 나열하는 것이 메모리에 캐시되지 않은 동일한 압축되지 않은 콘텐츠를 나열하는 것보다 빠르다는 것을 알 수 있음) 전체 아카이브를 읽어야 합니다.

색인을 빠르게 읽을 수 없는 것은 실제로 문제가 되지 않습니다. 보관된 테이블 내용을 자주 읽어야 할 것으로 예상되는 경우 목록을 별도의 파일에 저장할 수 있습니다. 예를 들어 생성 시 다음을 수행할 수 있습니다.

tar cvvf - dir 2> file.tar.xz.list | xz > file.tar.xz

IMO의 더 큰 문제는 아카이브의 순차적 측면으로 인해 아카이브의 시작 부분 전체를 읽지 않고는 단일 파일을 추출할 수 없다는 것입니다. IOW, 아카이브에서는 무작위 읽기를 수행할 수 없습니다.

이제 찾을 수 있는 파일의 경우 반드시 그럴 필요는 없습니다.

tar압축된 아카이브를 사용하여 gzip전체적으로 압축하는 경우 압축 알고리즘은 처음에 본 데이터를 사용하여 압축하므로 처음부터 압축 풀기를 시작해야 합니다.

그러나 xz데이터를 별도의 청크(압축이 효과적일 만큼 큰 크기)로 압축하도록 형식을 구성할 수 있습니다. 즉, 검색 가능한 파일의 경우 압축된 청크의 끝에 인덱스를 유지하는 한 압축되지 않은 무작위 데이터에 액세스할 수 있습니다. (적어도 덩어리).

pixz(병렬 xz) 아카이브를 압축할 때 이 기능을 사용하고 tar, 아카이브의 각 구성원의 시작 인덱스를 파일 끝에 추가할 수도 있습니다 xz.

따라서 검색 가능한 파일의 경우 압축된 경우 tar 아카이브의 내용 목록을 즉시 얻을 수 있을 뿐만 아니라(메타데이터는 없지만) pixz:

pixz -l file.tar.xz

그러나 전체 아카이브를 읽지 않고도 개별 요소를 추출할 수도 있습니다.

pixz -x archive/member.txt < file.tar.xz | tar xpf -

7z이제 Unix에서 이와 같은 것이 거의 사용되지 않는 이유는 zip주로 Unix 파일을 보관하지 않기 때문입니다. 이는 다른 운영 체제용으로 설계되었습니다. 이를 사용하여 데이터를 충실하게 백업할 수는 없습니다. 소유자(ID 및 이름), 권한과 같은 메타데이터를 저장할 수 없으며 심볼릭 링크, 장치, FIFO 등을 저장할 수 없으며 하드 링크에 대한 정보와 확장 속성 또는 ACL과 같은 기타 메타데이터 정보를 저장할 수 없습니다.

그 중 일부는 임의의 이름으로 멤버를 저장할 수도 없습니다(일부는 백슬래시, 개행, 콜론 또는 ASCII가 아닌 파일 이름을 차단합니다)( tar그러나 일부 형식에도 제한이 있습니다).

tgz/tar.xz 파일을 디스크에 압축 해제하지 마십시오!

명확하지 않은 경우 tgzor tar.bz2, tar.xz...를 다음과 같이 사용하지 마세요.

unxz 파일.tar.xz
tar tvf 파일.tar
xz 파일.tar

.tar파일 시스템에 압축되지 않은 파일이 있으면 뭔가 잘못된 것입니다 .

이러한 xz스트림 압축기의 요점은 다음과 같은 파이프라인에서 동적으로 사용할 수 있다는 것입니다.bzip2gzip

unxz < file.tar.xz | tar tvf -

최신 구현에서는 // 자신을 tar호출하는 방법을 알고 있지만 다음과 같습니다.unxzgunzipbzip2

tar tvf file.tar.xz

이 방법도 일반적으로 작동합니다. 즉석에서 데이터의 압축을 다시 풀고 압축되지 않은 버전의 아카이브를 디스크에 저장하지 않습니다.

이것은 다양한 형식의 압축된 Linux 커널 소스 트리입니다.

$ ls --block-size=1 -sS1
666210304 linux-4.6.tar
173592576 linux-4.6.zip
 97038336 linux-4.6.7z
 89468928 linux-4.6.tar.xz

첫째, 위에서 언급한 것처럼 7z와 zip은 소수의 심볼릭 링크를 저장할 수 없고 대부분의 메타데이터가 손실된다는 점에서 약간 다릅니다.

이제 시스템 캐시를 플러시한 후 콘텐츠를 나열할 수 있는 몇 가지 기회가 있습니다.

$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3
$ time tar tvf linux-4.6.tar > /dev/null
tar tvf linux-4.6.tar > /dev/null  0.56s user 0.47s system 13% cpu 7.428 total
$ time tar tvf linux-4.6.tar.xz > /dev/null
tar tvf linux-4.6.tar.xz > /dev/null  8.10s user 0.52s system 118% cpu 7.297 total
$ time unzip -v linux-4.6.zip > /dev/null
unzip -v linux-4.6.zip > /dev/null  0.16s user 0.08s system 86% cpu 0.282 total
$ time 7z l linux-4.6.7z > /dev/null
7z l linux-4.6.7z > /dev/null  0.51s user 0.15s system 89% cpu 0.739 total

tar.xz이 7년 된 PC에서도 파일을 나열하는 것이 파일을 읽는 것보다 빠르다는 것을 알 수 있습니다. .tar디스크에서 추가 메가바이트를 읽는 것이 더 작은 파일을 읽고 압축을 푸는 것보다 빠르기 때문입니다.

그렇다면 7z 또는 zip으로 아카이브를 나열하는 것이 더 빠르겠지만 문제가 되지 않습니다. 아카이브와 함께 파일 목록을 저장하면 쉽게 해결할 수 있다고 말했듯이:

$ tar tvf linux-4.6.tar.xz | xz > linux-4.6.tar.xz.list.xz
$ ls --block-size=1 -sS1 linux-4.6.tar.xz.list.xz
434176 linux-4.6.tar.xz.list.xz
$ time xzcat linux-4.6.tar.xz.list.xz > /dev/null
xzcat linux-4.6.tar.xz.list.xz > /dev/null  0.05s user 0.00s system 99% cpu 0.051 total

캐시를 제거한 후에도 속도는 7z나 zip보다 훨씬 빠릅니다. 또한 아카이브와 해당 인덱스의 누적 크기가 여전히 zip 또는 7z 아카이브보다 작다는 것을 알 수 있습니다.

또는 pixz색인 형식을 사용하십시오.

$ xzcat linux-4.6.tar.xz | pixz -9  > linux-4.6.tar.pixz
$ ls --block-size=1 -sS1 linux-4.6.tar.pixz
89841664 linux-4.6.tar.pixz
$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3
$ time pixz -l linux-4.6.tar.pixz > /dev/null
pixz -l linux-4.6.tar.pixz > /dev/null  0.04s user 0.01s system 57% cpu 0.087 total

이제 아카이브의 개별 요소를 추출하기 위해 tar 아카이브의 최악의 시나리오는 마지막 요소에 액세스하는 경우입니다.

$ xzcat linux-4.6.tar.xz.list.xz|tail -1
-rw-rw-r-- root/root      5976 2016-05-15 23:43 linux-4.6/virt/lib/irqbypass.c
$ time tar xOf linux-4.6.tar.xz linux-4.6/virt/lib/irqbypass.c | wc
    257     638    5976
tar xOf linux-4.6.tar.xz linux-4.6/virt/lib/irqbypass.c  7.27s user 1.13s system 115% cpu 7.279 total
wc  0.00s user 0.00s system 0% cpu 7.279 total

이는 전체 아카이브를 읽고 압축을 풀어야 하기 때문에 매우 나쁩니다. 비교:

$ time unzip -p linux-4.6.zip linux-4.6/virt/lib/irqbypass.c | wc
    257     638    5976
unzip -p linux-4.6.zip linux-4.6/virt/lib/irqbypass.c  0.02s user 0.01s system 19% cpu 0.119 total
wc  0.00s user 0.00s system 1% cpu 0.119 total

내 버전의 7z에는 임의 액세스 권한이 없는 것 같아서 다음보다 나은 것 같습니다 tar.xz.

$ time 7z e -so linux-4.6.7z linux-4.6/virt/lib/irqbypass.c 2> /dev/null | wc
    257     638    5976
7z e -so linux-4.6.7z linux-4.6/virt/lib/irqbypass.c 2> /dev/null  7.28s user 0.12s system 89% cpu 8.300 total
wc  0.00s user 0.00s system 0% cpu 8.299 total

pixz이제 이전에 생성한 항목이 생겼습니다 .

$ time pixz < linux-4.6.tar.pixz -x linux-4.6/virt/lib/irqbypass.c  | tar xOf - | wc
    257     638    5976
pixz -x linux-4.6/virt/lib/irqbypass.c < linux-4.6.tar.pixz  1.37s user 0.06s system 84% cpu 1.687 total
tar xOf -  0.00s user 0.01s system 0% cpu 1.693 total
wc  0.00s user 0.00s system 0% cpu 1.688 total

더 빠르지만 아카이브에 큰 청크가 거의 포함되어 있지 않기 때문에 여전히 상대적으로 느립니다.

$ pixz -tl linux-4.6.tar.pixz
 17648865 / 134217728
 15407945 / 134217728
 18275381 / 134217728
 19674475 / 134217728
 18493914 / 129333248
   336945 /   2958887

따라서 pixz최대 19MB에 달하는 대규모 데이터 블록을 읽고 압축을 풀어야 합니다.

아카이브를 더 작은 덩어리로 만들고 약간의 디스크 공간을 희생하여 임의 액세스 속도를 높일 수 있습니다.

$ pixz -f0.25 -9 < linux-4.6.tar > linux-4.6.tar.pixz2
$ ls --block-size=1 -sS1 linux-4.6.tar.pixz2
93745152 linux-4.6.tar.pixz2
$ time pixz < linux-4.6.tar.pixz2 -x linux-4.6/virt/lib/irqbypass.c  | tar xOf - | wc
    257     638    5976
pixz -x linux-4.6/virt/lib/irqbypass.c < linux-4.6.tar.pixz2  0.17s user 0.02s system 98% cpu 0.189 total
tar xOf -  0.00s user 0.00s system 1% cpu 0.188 total
wc  0.00s user 0.00s system 0% cpu 0.187 total

답변2

  1. 이러한 단점에도 불구하고 사람들은 왜 여전히 이를 그렇게 많이 사용하는 걸까요?

비즈니스 및 교육 관리자는 일이 효율적으로 실행될 때 감사하는 것보다 일이 중단될 때 더 주목받는 경향이 있습니다. 그러한 환경실험에 대한 두려움을 키우고,새로운 것을 경멸하다.

  1. "인스턴트 콘텐츠 목록" 기능을 원하는 경우 내 옵션은 무엇입니까(다른 소프트웨어/도구를 의미합니다)?

다르(isk아르곤chiver)의 수가 많다.아스팔트유사한 기능에 압축된 아카이브에 대한 빠른 무작위 액세스, AKA 카탈로그 작성, AKA 인덱싱, AKA "인스턴트 콘텐츠 목록"과 같은 향상된 기능이 추가되었습니다.

또한보십시오:아카이브의 임의 액세스를 잘 지원하는 압축 형식이 있습니까?

관련 정보