
(매우 긴) zip 파일 목록이 주어지면 압축이 풀린 크기를 어떻게 알 수 있나요?
답변1
unzip -Zt zipname
이를 사용하여 아카이브 내용 요약과 전체 크기를 직접 인쇄할 수 있습니다 . 다음은 출력의 예입니다.
unzip -Zt a.zip
1 file, 14956 bytes uncompressed, 3524 bytes compressed: 76.4%
그런 다음 awk를 사용하여 바이트 수를 추출할 수 있습니다.
unzip -Zt a.zip | awk '{print $3}'
14956
마지막으로 Tom의 답변에 표시된 대로 for 루프에 넣습니다.
total=0
for file in *.zip; do # or whichever files you want
(( total += $(unzip -Zt $file |awk '{ print $3 }') ))
done
echo $total
답변2
이것을 입력하면 unzip -l <zipfile>
압축되지 않은 크기와 모든 파일의 압축되지 않은 총 크기를 포함하여 zip에 있는 파일 목록이 인쇄됩니다.
이는 사람이 읽을 수 있는 출력이지만 unzip -l <zipfile> | tail -n1 | awk '{ print $1 }'
.
전체 크기를 얻으려면 다음을 수행하십시오.
total=0
for file in *.zip; do # or whichever files you want
(( total += $(unzip -l $file | tail -n1 | awk '{ print $1 }') ))
done
echo $total
답변3
unzip -l
각 파일의 크기를 나열하고 마지막 줄과 그 합계를 인쇄합니다. 따라서 zip 파일을 반복해서 볼 수 있고출력을 더하세요.unzip -l "$zip" | awk 'END {print $1}'
또는unzip -Zt "$zip" | awk 'END {print $3}'
. 쉘 루프의 경우 unzip -Zt
조금 더 빠를 수 있습니다.
total=0
for z in *.zip; do
set $(unzip -Zt -- "$z")
total=$((total + $3))
done
이는 파일의 전체 크기만 알려줍니다. 각 파일에는 작은 오버헤드가 있습니다. 이름을 저장할 공간, 일부 메타데이터를 저장할 공간, 그리고 대부분의 파일 시스템이 파일을 블록 단위로 할당하기 때문에 일부 사용되지 않은 공간도 있을 수 있습니다. 일반적인 파일 시스템에서는 오버헤드가 몇 킬로바이트에 이를 수 있습니다. 오버헤드는 파일 크기, 디렉터리 구조(디렉터리 오버헤드로 인해) 및 여러 개의 작은 파일을 동일한 블록으로 병합하는 파일 시스템의 기능에 따라 달라지므로 완전히 예측할 수는 없습니다.
대부분의 파일이 몇 킬로바이트를 초과하는 경우에는 이에 대해 걱정하지 마십시오. 그러나 파일이 매우 작은 경우 오버헤드를 고려해야 할 수도 있습니다. 다시 말하지만, 오버헤드는 파일 시스템에 따라 다릅니다. ext4에서 각 파일은 전체 블록(대부분의 시스템에서 기본적으로 4kB)을 채웁니다. 다음 스크립트는 각 파일을 4kB로 반올림하고 파일 이름 길이에 몇 바이트를 더하여 총 크기를 추정합니다.
for z in *.zip; do
unzip -l -- "$z"
done | awk '
$2 ~ /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/ {total += ($1+4095)/4096*4096 + length($0)}
END {print total}
'
답변4
보세요, 엄마, 루프가 없어요!
루프를 사용하지 않지만 여전히 동일한 답을 얻기 때문에 약간 더 빠를 수 있는 또 다른 솔루션이 있습니다.
unzip -l \*.zip|awk 'BEGIN{total=0}/ [0-9]+ files/{total=total+$1;}END{print "total bytes: "total}'
"BEGIN{total=0}" 부분은 꼭 필요한 것은 아닙니다.