Linux는 압축 없이 ZIP 크기를 결정합니다.

Linux는 압축 없이 ZIP 크기를 결정합니다.

zip명령을 사용하여 ZIP 파일을 만들고 싶습니다 . Zip 파일에는 다수의 하위 디렉터리, 파일 등이 포함된 다수의 디렉터리가 포함됩니다.

디스크에 실제로 압축하기 전에 ZIP 파일의 최종 크기를 계산하는 방법이 있습니까?

예: 최종 ZIP 파일 크기를 계산하여 ZIP이 특정 크기의 컨테이너에 들어갈 수 있는지 확인합니다(tmp에서도 디스크에 맞지 않으면 디스크에 대한 정보를 제공하지 않고 압축이 실패하기 때문에 디스크에서 작업을 수행할 수 없습니다). 아카이브 크기)

답변1

~에서zip 매뉴얼 페이지:

스트리밍 입력 및 출력. zip은 또한 단일 대시("-")를 zip 파일 이름으로 허용합니다. 이 경우 zip 파일을 표준 출력에 기록하여 출력을 다른 프로그램으로 파이프할 수 있습니다.

그래서:

$ zip -r - foo | wc -c

foo 디렉토리의 압축된 크기를 바이트 단위로 알려줍니다.

7z는 zip 파일의 표준 출력에 쓸 수 없습니다.

또 다른 옵션은 메모리 디스크를 생성하고 압축하는 것입니다.

답변2

StdOut으로 압축하고 바이트 수를 계산할 수 있지만 AFAIK zip는 stdout으로 압축하지 않습니다( 7zZIP 형식을 생성할 수 있는 다른 유틸리티도 마찬가지)(*).

Linux에서는 출력 파일이 지정되지 않은 경우 일반적으로 .tar.gz 파일을 생성하고 유틸리티를 stdout으로 출력합니다.

# compute size
outputSize=$(tar -cz the_directories | wc -c)
# create file
tar -czf some.tar.gz the_directories

어떤 경우에도 두 번의 압축을 수행하고 있으며 변환을 수행하지 않고는 출력 크기를 실제로 예측할 수 없습니다.

(*) 아마도 끝을 보지 않고는 ZIP 파일을 디코딩할 수 없기 때문일 것입니다.

답변3

하다

타르 CF  >(화장실-c)  <파일 이름 매개변수>;잠 1
파일에 쓰는 대신 작성된 바이트 수를 보고하는 명령에 파이프를 tar작성하십시오 . wc -c( tar압축에 필요한 모든 옵션을 포함합니다.) 이는 bash의 "프로세스 대체" 기능을 사용합니다. sleep 1이것이 없으면 명령이 완료될 때 쉘이 다음 쉘 프롬프트를 발행하고 명령이 완료될 tar때까지 기다리지 않기 때문에 사용됩니다 .wc

Bash가 없다면 명명된 파이프를 사용하여 동일한 작업을 수행할 수 있습니다.

관련 정보