bzip2: 실제로 압축을 풀지 않고 파일의 압축이 풀린 크기를 확인합니다.

bzip2: 실제로 압축을 풀지 않고 파일의 압축이 풀린 크기를 확인합니다.

큰 압축 파일이 있는데 bzip2실제로 압축을 풀지 않고 압축이 풀린 크기를 확인해야 합니다( gzip -l file.gz또는 와 유사 xz -l file.xz). 이를 달성하기 위해 어떻게 사용합니까 bzip2?

답변1

의견과 연결된 답변에서 언급했듯이 신뢰할 수 있는 유일한 방법은 (파이프에서) 압축을 풀고 바이트 수를 계산하는 것입니다.

$ bzcat file.bz2 | wc -c
1234

또는 불필요한 배관 없이 이 작업을 수행하는 도구를 찾으십시오(조금 더 효율적일 수 있음).

$ 7z t file.bz2
[...]
Everything is Ok
Size:       1234

이는 gzip 및 기타 형식에서도 작동합니다. gzip -l file.gz치수가 인쇄되어 있지만 잘못된 결과가 나올 수 있습니다 . 파일이 특정 크기를 초과하면 다음과 같은 결과가 나타납니다.

$ gzip --list foobar.gz 
         compressed        uncompressed  ratio uncompressed_name
           97894400            58835168 -66.4% foobar
$ gzip --list foobar.gz 
         compressed        uncompressed  ratio uncompressed_name
         4796137936                   0   0.0% foobar

또는 파일이 연결되었거나 전혀 올바르게 생성되지 않은 경우:

$ truncate -s 1234 foobar
$ gzip foobar
$ cat foobar.gz foobar.gz > barfoo.gz
$ gzip -l barfoo.gz 
         compressed        uncompressed  ratio uncompressed_name
                 74                1234  96.0% barfoo
$ zcat barfoo.gz | wc -c
2468

치수가 일치하지 않으므로 어쨌든 신뢰할 수 없습니다.

때로는 프로필 내용에 따라 부정행위를 할 수도 있습니다. 예를 들어 압축된 파일 시스템 이미지이고 시작 부분에 메타데이터 헤더가 있는 경우 해당 헤더의 압축을 풀고 여기에서 파일 시스템의 전체 크기를 읽을 수 있습니다.

$ truncate -s 1234M foobar.img
$ mkfs.ext2 foobar.img
$ bzip2 foobar.img
$ bzcat foobar.img.bz2 | head -c 1M > header.img
$ tune2fs -l header.img
tune2fs 1.45.4 (23-Sep-2019)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          95b64880-c4a7-4bea-9b63-6fdcc86d0914
[...]
Block count:              315904
Block size:               4096

따라서 작은 부분을 추출하면 315904 4096바이트 블록, 즉 1234MiB라는 것을 알 수 있습니다.

압축된 파일의 실제 크기에 대한 보장은 없지만(크거나 작을 수 있음), 이상한 점은 없다고 가정하면 gzip -l무엇보다 신뢰할 수 있습니다.

마지막으로, 이러한 파일을 먼저 생성했다면 크기만 기록해 두세요.

답변2

이 질문에는 이미 답변이 있습니다.여기. 다음과 같이 붙여넣습니다.

다른 사람들이 지적했듯이 bzip2는 많은 정보를 제공하지 않습니다. 하지만 이 기술은 효과가 있습니다. 파일의 압축을 풀어야 하지만 압축이 풀린 데이터를 디스크에 쓸 필요는 없습니다. 이는 "충분히 좋은" 솔루션일 수 있습니다.

$ ls -l foo.bz2
-rw-r--r-- 1 ~quack ~quack 2364418 Jul  4 11:15 foo.bz2

$ bzcat foo.bz2 | wc -c         # bzcat decompresses to stdout, wc -c counts bytes
2928640                         # number of bytes of decompressed data

이 출력을 다른 것으로 파이프하여 사람이 읽을 수 있는 형식을 제공할 수 있습니다.

$ ls -lh foo.bz2
-rw-r--r-- 1 quack quack 2.3M Jul  4 11:15 foo.bz2

$ bzcat foo.bz2 | wc -c | perl -lne 'printf("%.2fM\n", $_/1024/1024)'
2.79M

관련 정보