gz 파일을 분할하고 개별적으로 압축 해제

gz 파일을 분할하고 개별적으로 압축 해제

2.6GB의 큰 .gz 파일이 있습니다. 용량 제한으로 인해 압축을 풀 수 없습니다. 파일은 대용량 텍스트 파일입니다. 크기 제한으로 인해 압축을 완전히 풀 수 없습니다. 각 파일을 작업할 수 있도록 10개의 개별 부분으로 분할하고 각 부분의 압축을 개별적으로 풀고 싶습니다.

내 질문은 다음과 같습니다

  1. 그게 가능합니까?
  2. 또한 대답의 일부로 명령에 익숙하지 않기 때문에 명령을 제공하는 것도 가능합니까?

감사해요

답변1

gzip압축 형식은 연결된 여러 개의 작은 압축 파일로 구성된 파일의 압축 해제를 지원하지만(압축 해제된 파일에는 연결된 압축 해제된 데이터가 포함됨) 분할된 압축 파일의 압축 해제는 지원하지 않습니다.

압축이 풀린 데이터의 "조각"으로 끝나기를 원한다고 가정하면 압축이 풀린 데이터를 dd여러 번 공급하고 매번 압축이 풀린 데이터의 다른 조각을 선택하여 파일에 저장하고 나머지는 삭제함으로써 이 문제를 해결할 수 있습니다.

여기서는 매우 작은 샘플 텍스트 파일을 사용하고 있습니다. 여러번 압축을 풀었습니다 (~ 할 것이다(큰 파일의 경우 조금 더 오래 걸립니다.) 그리고 압축이 풀린 데이터에서 8바이트 조각을 선택할 때마다. 동일한 작업을 수행할 수 있지만 더 큰 값 bs("블록 크기")을 사용할 수 있습니다.

$ cat file
hello
world
1
2
3
ABC

$ gzip -f file   # using -f to force compression here, since the example is so small

$ gunzip -c file.gz | dd skip=0 bs=8 count=1 of=fragment
1+0 records in
1+0 records out
8 bytes transferred in 0.007 secs (1063 bytes/sec)

$ cat fragment
hello
wo

$ gunzip -c file.gz | dd skip=1 bs=8 count=1 of=fragment
1+0 records in
1+0 records out
8 bytes transferred in 0.000 secs (19560 bytes/sec)

$ cat fragment
rld
1
2

(등.)

bs설정의 약 10분의 1만 사용압축되지 않은파일 크기는 반복할 때마다 skip0에서 1로 증가합니다 .


업데이트: 사용자는 압축되지 않은 데이터의 행 수를 계산하려고 합니다(질문에 첨부된 의견 참조). 이는 압축되지 않은 데이터의 일부를 디스크에 저장하지 않고도 쉽게 수행할 수 있습니다.

$ gunzip -c file.gz | wc -l

gunzip -c파일의 압축을 풀고 압축되지 않은 데이터를 표준 출력에 씁니다. wc이 플래그가 있는 유틸리티는 -l이 스트림에서 데이터를 읽고 읽은 행 수를 계산합니다.

답변2

글쎄요, split어떤 방식으로든 여러분과 공유하게 되어 기쁩니다.

10개의 개별 부품을 만들려면 압축되지 않은 파일의 크기를 알아야 합니다. 다음은 각각 크기가 약 1GiB인 파일을 제공합니다.

gunzip < bigfile.gz | split --line-bytes=1G - bigfile-split

1G는 여전히 텍스트 파일용으로 많이 사용되며 많은 편집자가 이러한 대용량 파일을 잘 처리하지 못합니다. 따라서 실제로 수행하려는 작업에 따라 더 작은 분할을 수행할 수도 있습니다. 아니면 매번 압축을 풀어야 하는 경우에도 gz다른 도구에 충분하도록 그대로 두십시오 .zgrep

로그 파일인 경우 자연스럽게 더 작은 분할이 생성되도록 로그 회전을 미세 조정해야 할 수도 있습니다.

관련 정보