디렉터리 크기 계산 차이

디렉터리 크기 계산 차이

서명을 위해 터미널에서 디렉터리 크기를 가져와야 합니다. 다음 명령을 사용하고 있습니다.

du -s /path/to/dir

결과에 기존 UNIX 블록 크기(512바이트)를 곱하여 실제 디렉터리 크기(바이트)를 얻었습니다. 그러나 Finder의 정보 가져오기 대화 상자 창은 터미널 명령을 사용하여 계산된 크기보다 약간 작게 나타납니다. 그리고 모든 폴더/번들에서 재현 가능한 것 같습니다. 내가 무엇을 놓치고 있나요?

답변1

일반적으로 du다음에 대한 정보는디스크 사용량(그래서 이름이 붙여졌습니다). 기억해주세요

disk usage != sum of file sizes

각 파일은 일정량의 공간을 차지하기 때문에조각파일 시스템에서( man mkfs.ext2예제 참조) 이는 파일의 디스크 사용량이 실제 크기와 동일한 경우가 드물다는 것을 의미합니다. 이를 위해서는 크기가 블록 크기의 정확한 배수여야 합니다.

파일 시스템 블록을 파일의 일부를 포함하는 상자로 생각하십시오. 각 블록은 파일의 일부만 포함할 수 있습니다.

GNU 버전의 경우 du이 옵션을 확인하세요 --apparent-size.


좀 있을 때스파스 파일파일 시스템에서!

답변2

Mac OS X 및 Finder(Snow Leopard 버전 10.6.8)와 관련하여 다음 사항을 확인했습니다.

  • 아래 코드((1))를 사용하여 Finder에서 경로(파일 또는 폴더)의 "양자화된" 숫자의 바이트 수를 가져옵니다 bash.
  • Finder Info 창과 창에는 이진수(2, 1024) 바이트가 아닌 10진수(10, 1000) 바이트로 "양자화된"(예: 1000KB) 숫자가 표시되므로 "양자화"를 1000으로 나누고 단위( 바이트) 접두사 "수량자"(크기)를 붙이고 이상한 "키에서 벗어난" 반올림을 수행합니다. (내 전체 코드는 주석 처리된 개발 코드로 채워져 있고 여러 파일(및 언어)로 분할되어 공유하기 어렵습니다.)
    내가 알 수 있는 한, 내 "수량화된" 숫자는 다음의 "수량화된" 숫자와 동일합니다. 파인더.
  • 또한 코드 외에는 내 셸에 환경 변수가 설정되어 있지 않으며 (한 번도 없었음) 있다고 말하고 싶지만 BLOCKSIZE두 버전 모두 (이제 조금) 테스트했으며 기본값은 $BLOCKSIZE동일합니다. 값.

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • 일치시킬 수 없는 양자화되지 않은 숫자입니다.
    내가 말할 수 있는 유일한 것은 파일만 계산하여 가까워졌고(따라서 ~'filesystem Metaindex/headers'~ 데이터 디렉터리는 제외) 내가 얻은 가장 가까운 것은 다음과 같다는 것입니다.

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • (xnu) du(1)도 (gnu) gdu(1)도 확장 속성을 계산하지 않는 것 같습니다( xattr)

그럼 난 그냥 해야 해말장난"길을 달리고 계산을 좀 해보세요."
이번에는 진정하세요. 정말 좋은 밤이 되세요.

답변3

디렉터리에 있는 모든 파일의 합계:

운영 체제:find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

리눅스:find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'

답변4

내 Ubuntu 시스템에서 ext4를 사용하면 du -b file실제 파일 크기(바이트)와 du -b dir파일 크기(바이트) + 디렉터리 오버헤드가 주어지면 내 경우 오버헤드는 4096바이트의 배수입니다.

이 오버헤드는 파일 수에 따라 증가합니다.
참고: 파일이 삭제되더라도 디렉터리 오버헤드는 파일이 삭제되기 전의 높은 수준으로 유지됩니다.

복구되는지 확인하기 위해 재부팅을 시도하지 않았지만 두 경우 모두 기록 상황에 따라 디렉터리 크기가 변경되었음을 의미합니다.

전체 크기를 정확하게 계산하려면 각 파일의 크기를 계산하는 것이 아마도 가장 좋은 방법일 것입니다.문서크기.

다음 스크립트는 모든 파일 크기의 합계를 바이트 단위로 계산합니다.

OS X의 경우 -b"du" 옵션이 없어도 작동합니다 stat. (있는 경우:)... 주석 처리된 줄은 Ubuntu stat대안을 보여줍니다 du -b.

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total

관련 정보