이 질문에는 이미 답변이 있습니다.
Linux 또는 Mac OS X 디렉토리에서 모든 파일의 크기를 (재귀 적으로) 찾기 위해 어떤 명령을 사용합니까?
답변
du
OS X에서 사용되는 BSD 버전은 512 바이트 블록으로 크기를보고합니다. 크기는 기본적으로 다음 512 바이트 값으로 올림됩니다. 이것은 디스크의 공간을 알려주며, 이는 데이터의 양보다 큽니다. 작은 파일이 많으면 차이가 클 수 있습니다.
다음은 예입니다.
이것은 regular 값입니다 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
되며 각 파일은 개별 파일로 한 번, 디렉토리에서 항목으로 한 번 두 번 나열됩니다.
GNU 버전 du
은 블록 대신 실제 바이트로 값을 제공 할 수 있습니다. 불행히도의 BSD 버전은 du
유연하지 않습니다.
답변
단일 파일의 크기 표시
du -h path_to_a_file
디렉토리, 각 하위 디렉토리 및 개별 파일의 내용 크기를 표시합니다.
du -h path_to_a_directory
디렉토리 내용의 크기를 표시하십시오.
du -sh path_to_a_directory
답변
du 는 파일 크기가 아닌 디스크 사용을 알려줍니다 .
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
참고 : 옵션 -h
에 대한이 sort
OSX / BSD에서 사용할 수 없습니다, 당신은 설치했습니다, 그래서 sort
에서 coreutils
(예를 통해 brew
)와 빈 경로를합니다 적용 PATH
, 예를 들어,
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
그렇지 않으면 다음을 사용하십시오.
du -a . | sort -rn | head -20
답변
나는 모든 접근 방식을 결합하여 인간이 읽을 수있는 출력과 결합했습니다. 결과는 다음과 같습니다.
#!/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 } }}'