실제 디렉토리 크기를 얻는 방법은 무엇입니까?


17

UNIX / Linux 표준 도구를 사용하여 실제 디렉토리 크기를 얻으려면 어떻게합니까?

대체 질문 : 어떻게합니까 나에게 실제 디렉터리 크기 (안 디스크 사용)를 보여?

사람들이 "size"라는 용어를 다르게 정의한 것 같습니다. "directory size"에 대한 정의는 해당 디렉토리에있는 모든 일반 파일의 합계입니다.

디렉토리 inode의 크기 또는 파일이 해당 파일 시스템에서 차지하는 모든 것 (블록 * 블록 크기)에 대해서는 신경 쓰지 않습니다. 각각 1 바이트 씩 3 개의 파일이있는 디렉토리는 3 바이트 (내 정의에 따라)의 디렉토리 크기를 갖습니다.

du를 사용하여 디렉토리 크기를 계산하는 것은 신뢰할 수없는 것 같습니다.
예를 들어, mkdir foo && du -b foo0 바이트 대신 4096 바이트 인 "4096 foo"를보고합니다. 매우 큰 디렉토리의 경우,보고 된 디렉토리 크기는 du -hs100GB (!) 이상 (압축 파일 시스템)만큼 줄어들 수 있습니다.

실제 디렉토리 크기를 얻기 위해 어떤 도구 / 옵션을 사용해야합니까?


새로운 위치에서 어떤 파일 시스템이 사용 xfs됩니까?
Sergey Vlasov 2016 년


새 FS가 실제로 XFS 인 경우 디스크 사용량이 크게 증가한 것은 사전 할당적극적 으로 인해 발생하므로 디스크 사용 비용으로 파일 조각화가 줄어 듭니다.
Sergey Vlasov 2016 년

답변:


8

다음은 Unix 표준 도구 (POSIX)를 사용하여 사람이 읽을 수있는 디렉토리 크기를 표시하는 스크립트입니다.

#!/bin/sh
find ${1:-.} -type f -exec ls -lnq {} \+ | awk '
BEGIN {sum=0} # initialization for clarity and safety
function pp() {
  u="+Ki+Mi+Gi+Ti+Pi+Ei";
  split(u,unit,"+");
  v=sum;
  for(i=1;i<7;i++) {
    if(v<1024) break;
    v/=1024;
  }
  printf("%.3f %sB\n", v, unit[i]);
}
{sum+=$5}
END{pp()}'

예 :

$ ds ~        
72.891 GiB

이제 모든 제안 된 ls호출에서 누락 된 또 다른 옵션을 찾았습니다 -q. 이 옵션을 사용하지 않으면 일부 파일 이름에 개행 문자가 포함되어 있으면 스크립트가 중단됩니다. 정말 믿을만한 쉘 스크립트를 작성하는 것은 너무 어렵다…
Sergey Vlasov

@SergeyVlasov 내가 게시 한 스크립트는 그러한 파일로 중단되어서는 안되며 여분의 줄만 무시하면됩니다. 주의 깊게 조작 된 파일에 숫자 값이 포함 된 다섯 번째 콜론이있는 추가 행이있는 경우 문제가 발생할 수 있습니다. 당신의 제안은 실제로 그러한 상황을 피할 것입니다. 팁 주셔서 감사합니다, 스크립트가 업데이트되었습니다.
jlliagre 2016 년

탁월한 답변. +1 you sir
ehime

가장 안정적인 솔루션 중 하나입니다. 공백이나 따옴표가있는 파일 이름으로 작동하며 사람이 읽을 수있는 크기로 인쇄합니다.
basic6

@KIAaze 코드를 검토하고 수정 해 주셔서 감사합니다!
jlliagre 2016 년

8

일부 버전은 디스크 사용 대신 크기를 나타내 du도록 인수 --apparent-size를 지원합니다 . 따라서 귀하의 명령은 다음과 같습니다.

du -hs --apparent-size

Ubuntu 12.04 LTS에 포함 된 du 설명서 페이지에서 :

--apparent-size
      print apparent sizes,  rather  than  disk  usage;  although  the
      apparent  size is usually smaller, it may be larger due to holes
      in (`sparse') files, internal  fragmentation,  indirect  blocks,
      and the like

1
작동하지 않습니다 : 빈 다이어를위한 공간을보고하십시오
Karl Forner

1
이것은 나를 위해 일했습니다.
connorbode

2
다른 파일 시스템의 디렉토리를 비교할 때 크기가 크게 다릅니다. 예를 들어, zfs 파일 시스템에서 동일한 폴더의 겉보기 크기는 290Gb이고 exFat는 324Gb입니다. 위의 솔루션은 동일한 크기를 제공합니다.
Pixus.ru

4

다음을 사용하는 대안입니다 ls.

ls -nR | grep -v '^d' | awk '{total += $5} END {print total, "Total"}'

ls -nR: -n처럼 -l되지만 숫자 UID 및 GID를 -R나열하고 하위 디렉토리를 재귀 적으로 나열합니다.

grep -v:일치하지 않는 선을 선택하려면 일치감을 반전시킵니다. (-v는 POSIX에 의해 지정됩니다.) '^ d'디렉토리를 제외합니다.

LS 명령 : http://linux.about.com/od/commands/l/blcmdl1_ls.htm

맨 그렙 : http://linux.die.net/man/1/grep

편집 :

@ Sergey Vlasov의 제안으로 수정되었습니다.


사용자 및 그룹 이름에 공백이 포함될 수 있으므로 ( 이름 대신 UID / GID 번호 표시) 대신 -n옵션을 사용하는 것이 더 안전 합니다 (예 : 시스템을 Windows 도메인에 가입시키는 데 사용 되거나 사용되는 경우 ). . 또한 사용자 및 그룹 이름을 조회 할 필요가 없기 때문에 더 빨라야합니다. ls-lwinbindsssddomain users
Sergey Vlasov 2018 년

감사합니다, 이것은 find -exec ls보다 훨씬 빠릅니다!
gpothier 2016 년

4

duGNU coreutils를 사용 한다고 가정하면 이 명령은 파일 수에 대한 임의의 제한없이 디렉토리 내에서 임의의 수의 일반 파일의 총 겉보기 크기를 계산해야합니다.

find . -type f -print0 | du -scb --files0-from=- | tail -n 1

내부에 일부 하드 링크 된 파일이 있고 각 하드 링크를 개별적으로 계산하려면 (기본적으로 여러 하드 링크를 한 번만 계산) -l옵션을 추가하십시오 .dudu

일반과의 가장 중요한 차이점 du -sb은 재귀 du는 디렉토리의 크기도 계산 한다는 것 입니다. 디렉토리의 크기는 파일 시스템마다 다르게보고됩니다. 이를 피하기 위해이 find명령은 일반 파일 만에 전달하는 데 사용됩니다 du. 또 다른 차이점은 심볼릭 링크가 무시된다는 것입니다 (심지어 계산해야하는 경우 find명령을 조정해야 함).

이 명령은 일반보다 더 많은 메모리를 소비합니다 du -sb사용하는 것이 있기 때문에, --files0-from=FILE만드는 du저장 장치와의 inode 번호 모든 처리 된 파일을 두 개 이상의 하드 링크 파일 만 기억의 기본 동작에 반대. -l장치와 inode 번호를 저장하는 유일한 이유는 이미 처리 된 하드 링크 된 파일을 건너 뛰기 때문에이 옵션을 사용하여 하드 링크를 여러 번 계산하는 경우에는 문제가되지 않습니다 .

사람이 읽을 수있는 전체 크기 표현을 얻으려면 -h옵션을 추가하십시오 ( du다른 제안 된 답변과 달리 한 번만 호출되고 총 크기 자체를 계산 하기 때문에 작동 합니다).

find . -type f -print0 | du -scbh --files0-from=- | tail -n 1

또는 (의 영향 -b이 다음에 의해 무시되는 것이 걱정되는 경우 -h)

find . -type f -print0 | du -sc --apparent-size -h --files0-from=- | tail -n 1

FreeBSD를 위해 무엇을해야할지 확실하지 않습니다.- -b로 대체 될 수는 있지만에 -A -B 1해당하는 것은 없으며 , 파일 목록이 더 큰 경우 (및 사람이 읽을 수있는 출력을위한 외부 솔루션)를 --files0-from=-사용 xargs하려면 해결 방법이 필요합니다 ARG_MAX.
Sergey Vlasov 2016 년

3

디렉토리가 차지하는 공간을 제외하고 파일 크기 만 원하는 경우 다음과 같은 작업을 수행 할 수 있습니다.

find . -type f -print0 | xargs -0 du -scb | tail -n 1

@SergeyVlasov는보다 많은 파일이 있으면 실패 할 것이라고 지적했습니다 argmax. 이를 피하기 위해 다음과 같은 것을 사용할 수 있습니다.

find . -type f -exec du -sb '{}' \; | gawk '{k+=$1}END{print k}'

1
디렉토리가) (가 execve에 대한 제한에 인수 크기에 맞지 않는 너무 많은 파일이 포함되어있는 경우이 명령은 자동으로 잘못된 결과를 줄 것이다 -이 경우에 xargs호출합니다 du여러 번, 각 호출은 그 부분에 대한 총계를 인쇄합니다 전체 파일 목록 tail중 마지막 부분의 전체 크기 만 표시됩니다.
Sergey Vlasov 2016 년

1
@ SergeyVlasov 좋은 지적, 나는 생각하지 않았다, 감사, 답변 업데이트.
terdon 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.