![Linux는 압축 없이 ZIP 크기를 결정합니다.](https://linux55.com/image/140963/Linux%EB%8A%94%20%EC%95%95%EC%B6%95%20%EC%97%86%EC%9D%B4%20ZIP%20%ED%81%AC%EA%B8%B0%EB%A5%BC%20%EA%B2%B0%EC%A0%95%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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으로 압축하지 않습니다( 7z
ZIP 형식을 생성할 수 있는 다른 유틸리티도 마찬가지)(*).
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가 없다면 명명된 파이프를 사용하여 동일한 작업을 수행할 수 있습니다.