디렉토리 크기 계산 차이


9

서명 목적으로 터미널의 디렉토리 크기를 가져와야합니다. 다음 명령을 사용하고 있습니다.

du -s /path/to/dir

결과에 전통적인 UNIX 블록 크기 (512 바이트)를 곱하고 실제 디렉토리 크기를 바이트 단위로 가져옵니다. 그러나 Finder의 "정보 입수"대화창은 터미널 명령으로 계산 된 것보다 약간 작은 크기를 보여줍니다. 그리고 그것은 모든 폴더 / 번들에서 재현 가능한 것 같습니다. 내가 무엇을 놓치고 있습니까?

답변:


11

일반적으로 디스크 사용 (이름이 나오는 곳) du에 대한 정보를 표시합니다 . 명심하십시오

disk usage != sum of file sizes

각 파일은 파일 시스템에서 여러 블록 을 차지하기 때문에 ( man mkfs.ext2예를 들어). 이는 매우 드문 상황에서만 파일의 디스크 사용량이 실제 크기와 동일하다는 것을 의미합니다. 즉, 크기는 블록 크기의 배수 여야합니다.

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

의 GNU 버전의 du경우 --apparent-size옵션을 확인하십시오 .


파일 시스템에 희소 파일 이있을 때 더욱 흥미로운 상황이 발생할 수 있습니다 !


그러한 옵션은 없습니다 (Linux가 아닌 OS X에 있습니다). 아마도 태그가 충분하지 않기 때문에 질문에서 언급해야 할 것입니다.)
Eimantas

아, 맞아 ... 그런 다음 맨 페이지를보고 actualor에 대한 참조를 찾아보십시오 apparent. (또한 업데이트 된 설명을 참조하십시오).
rozcietrzewiacz

2
불평등을 제외하고는 정확하다. 파일 크기는 때때로 파일을 저장하는 데 필요한 실제 디스크 공간보다 클 수 있습니다. ( unix.stackexchange.com/q/33801/9426 )
Stéphane Gimenez

@ StéphaneGimenez Wow ... 말해줘서 고마워!
rozcietrzewiacz

2

Mac OS X 및 Finder (Snow Leopard, 버전 10.6.8)에 대해 다음 사항을 확인했습니다.

  • bash아래 코드 (1)에 경로 (파일 또는 폴더)의 Finder의 '계량화 된'수치에 대한 바이트 수를 얻습니다 .
  • Finder "정보"창과 창에는 바이너리 (base 2, 1024) 바이트와는 달리 10 진수 (base 10, 1000) 바이트로 'quantified'(예 : 킬로 KB) 수치가 표시되므로 다음과 같이 나누어 'quantify'합니다. 1000으로 설정하고 단위 (바이트) 접두사 'quantifier'(크기)를 늘리고 이상한 "off key"반올림을 수행합니다. (내 전체 코드는 주석 처리되지 않은 개발 코드로 가득 차 있으며 여러 파일 (및 언어)로 나뉘어져 공유하기가 어렵습니다.)
    지금까지 '수량'수치는 Finder의 '수량'수치와 같습니다. .
  • 또한 코드와 함께 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

  • 일치하지 않은 수량화되지 않은 숫자입니다.
    내가 말할 수있는 유일한 것은 파일 수를 계산하여 더 가까워지고 (따라서 디렉토리 ~ 'file-system meta index / header'~ data 제외) 가장 가까운 것은 다음과 같습니다.

#!/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)

그리고 난 그냥 있어야 말장난 '실행 경로 및 수학 할'
밖으로 평화를이 시간을 fo'real 굿나잇.


1

내 우분투 시스템에서 ext4를 사용하여 du -b file실제 파일의 du -b dir바이트 크기를 제공하고 파일 + 디렉토리 오버 헤드의 바이트 크기를 제공합니다. 제 경우에는 오버 헤드는 4096 바이트의 배수입니다.

이 오버 헤드는 파일 수가 증가함에 따라 증가합니다.
참고 : 파일이 삭제 되더라도 디렉토리 오버 헤드는 파일을 삭제하기 전의 상위 레벨로 유지됩니다.

재부팅 여부를 확인하기 위해 재부팅을 시도하지는 않았지만 어느 경우이든 이는 역사적인 상황에 따라 디렉토리 크기가 달라짐을 의미합니다.

전체 파일 크기 의 정확한 값을 얻으려면 각 파일 크기를 계산하는 것이 가장 좋습니다 .

다음 스크립트는 모든 파일 크기 (바이트)를 합산합니다.

당신이하지 않은 경우 OS X를 들어, -b'뒤'에 대한 opton을, 당신이 사용할 수있는 stat대신에 (해당되는 경우 :) ... 주석으로 라인 쇼 우분투. 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

2
OSX는 없습니다du -b다른stat . 스크립트는 Linux 외부에서 이식성이 없습니다.
Gilles 'SO- 악 그만

OS X에서 MacPorts를 사용하면 as coreutils의 GNU 버전을 설치 하도록 설치할 수 있습니다 . 그 그리 정확히 휴대용,하지만 몇 가지 핵심 유틸의 GNU 버전을 얻을 OS X에있는 사람들에게 유용 할 수 있습니다. dugdu
drfrogsplat 1

1

디렉토리의 모든 파일을 합산하십시오.

OSX : 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}'


find: unrecognized: -printf. 알파인 이미지
gadelat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.