it-swarm-ko.com

명령 줄에서 Linux 또는 Mac OS X 디렉토리의 크기를 얻으려면 어떻게해야합니까?

Linux 또는 Mac OS X 디렉토리에서 모든 파일의 크기를 (재귀 적으로) 찾기 위해 사용하는 명령은 무엇입니까?

71
Daryl Spitzer

OS X에서 사용되는 du의 BSD 버전은 512 바이트 블록 크기를보고합니다. 크기는 기본적으로 다음 512 바이트 값으로 반올림됩니다. 이것은 디스크의 공간을 알려주며 데이터의 양보다 큽니다. 작은 파일이 많으면 그 차이가 클 수 있습니다.

여기에 예제가 있습니다.

이것은 정규 du 값입니다. 512 바이트 블록 단위입니다.

$ du -s
248   .

-h 플래그는 더 읽기 쉬운 숫자를 킬로바이트 단위로 나타냅니다. 예상대로 512 바이트 블록의 절반입니다.

$ du -hs
124K  .

마지막으로 findawk을 사용하여 파일의 실제 바이트 합계를 얻을 수 있습니다. 이것은 느린 일이지만 작동합니다.

$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527

이 값은 Finder의 정보 입수 윈도우에서보고 한 숫자와 정확하게 일치합니다. (이 파일 집합에는 이상한 포크 나 xattrs가 없습니다.) 이것은 du에 의해보고 된 값보다 상당히 작습니다.

다음은 작동 방식입니다. 모든 파일의 목록을 가져 와서 ls -l로 전달합니다. 그런 다음 awk을 사용하여 바이트를 계산합니다. -type f 플래그는 ls에 파일 만 보내고 디렉토리는 보내지 않도록합니다. 이 플래그가 없으면 ls에 디렉토리 이름을 보내고 각 파일은 한 번 개별 파일로, 한 번은 디렉토리의 항목으로 두 번 나열됩니다.

du의 GNU버전은 블록 대신 실제 바이트로 값을 제공 할 수 있습니다. 불행한 점은 du의 BSD 버전이 유연하지 않다는 것입니다.

79
wch

단일 파일의 크기 표시

du -h path_to_a_file

디렉토리, 각 하위 디렉토리 및 개별 파일의 내용 크기를 표시합니다.

du -h path_to_a_directory

디렉토리 내용의 크기 표시 :

du -sh path_to_a_directory

75
Daryl Spitzer

d- 파일 크기 가 아니라 디스크 사용 을 알려줍니다.

find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'

위의 터미널 코드 (osx 10.6에 있음)는 최상의 결과를 제공하며 "find ... -exec"보다 빠릅니다.

빠른 벤치 마크

time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970

real    0m0.086s
user    0m0.029s
sys 0m0.073s

time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970

real    0m18.515s
user    0m2.929s
sys 0m9.339s
9
Acid

모든 파일과 디렉토리의 크기를 재귀 적으로 표시하는 du -ah .를 사용할 수 있습니다.

이것은 sort과 결합 할 수 있으므로 현재 폴더에서 상위 20 개의 가장 큰 디렉토리를 볼 수 있습니다 :

du -ah . | sort -rh | head -20

참고 : sort에 대한 -h 옵션은 OSX/BSD에서 사용할 수 없으므로 sort에서 coreutils을 (예 : brew을 통해) 설치하고 bin 경로를 PATH에 적용해야합니다.

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

그렇지 않으면 다음을 사용하십시오.

du -a . | sort -rn | head -20
5
kenorb

나는 모든 approuches를 결합하여 결과를 사람이 읽을 수있는 출력과 결합시켰다 :

#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'

Gist에 링크 : https://Gist.github.com/mlegenhausen/9365461

2
malte