Linux 또는 Mac OS X 디렉토리에서 모든 파일의 크기를 (재귀 적으로) 찾기 위해 사용하는 명령은 무엇입니까?
OS X에서 사용되는 du
의 BSD 버전은 512 바이트 블록 크기를보고합니다. 크기는 기본적으로 다음 512 바이트 값으로 반올림됩니다. 이것은 디스크의 공간을 알려주며 데이터의 양보다 큽니다. 작은 파일이 많으면 그 차이가 클 수 있습니다.
여기에 예제가 있습니다.
이것은 정규 du
값입니다. 512 바이트 블록 단위입니다.
$ du -s
248 .
-h
플래그는 더 읽기 쉬운 숫자를 킬로바이트 단위로 나타냅니다. 예상대로 512 바이트 블록의 절반입니다.
$ du -hs
124K .
마지막으로 find
과 awk
을 사용하여 파일의 실제 바이트 합계를 얻을 수 있습니다. 이것은 느린 일이지만 작동합니다.
$ 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 버전이 유연하지 않다는 것입니다.
단일 파일의 크기 표시
du -h path_to_a_file
디렉토리, 각 하위 디렉토리 및 개별 파일의 내용 크기를 표시합니다.
du -h path_to_a_directory
디렉토리 내용의 크기 표시 :
du -sh path_to_a_directory
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
모든 파일과 디렉토리의 크기를 재귀 적으로 표시하는 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
나는 모든 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