디렉토리에있는 모든 파일 내용의 총 크기 [닫힘]


103

ls또는을 사용하면 du각 파일이 차지하는 디스크 공간의 양을 알 수 있습니다.

각 파일을 열고 바이트를 계산하면 얻을 수있는 파일 및 하위 디렉터리의 모든 데이터의 합계가 필요합니다. 각 파일을 열고 세지 않고도 얻을 수 있다면 보너스 포인트.


1
ls실제로 디스크 공간이 아니라 각 파일의 바이트 수를 표시합니다. 이 정도면 충분합니까?
Greg Hewgill

3
참고 du이 질문에 대답 할 수 없습니다. 디렉토리가 디스크에서 차지하는 디스크 공간의 양 (파일의 데이터와 보조 파일 시스템 메타 정보의 크기)을 보여줍니다. du출력은 모든 파일의 총 크기보다 작을 수있다. 이는 파일 시스템이 디스크에 압축 된 데이터를 저장할 수 있거나 하드 링크가 사용되는 경우 발생할 수 있습니다. 정답은 기반으로 ls하고 find. 의해 답변을 참조하십시오 넬슨 과에 의해 bytepan 여기에, 또는이 답변 : unix.stackexchange.com/a/471061/152606
anton_rh

답변:


108

디스크의 파일이 차지하는 크기가 아닌 '명확한 크기'(즉, 각 파일의 바이트 수)를 원하면 -b또는 --bytes옵션을 사용하십시오 (GNU coreutils 가있는 Linux 시스템을 사용하는 경우 ) :

% du -sbh <directory>

1
안타깝게도 내 임베디드 Dev 박스가 아닌 새로운 Red Hat 박스에서 작동합니다.
Arthur Ulfeldt

3
사람이 읽을 수있는 형식으로 "명확한 크기"를 쉽게 표시 할 수있는 방법이 있습니까? du -shb(이 답변에서 제안한대로) 사용 하면 -b설정이 -h설정 보다 우선하는 것 같습니다 .
Mathias Bynens

6
@MathiasBynens 플래그의 순서를 반대로합니다 (예 : du -sbh <dir>). 나를 위해 작동합니다.
Luis E.

2
@MathiasBynensdu -sh --apparent-size /dir/
Jongosi

2
@Arkady CentOS 및 Ubuntu에서 솔루션을 시도했지만 작은 오류가 있습니다. "du -sbh"를 원합니다. "-h"플래그는 마지막에 와야합니다.
theJollySin

46

사용 du -sb:

du -sb DIR

선택적 h으로보다 사용자 친화적 인 출력을위한 옵션을 추가합니다 .

du -sbh DIR

4
-b는 MacOS의 불법 옵션 인 것 같습니다. 'du
lynxoid

3
@lynxoid : brew :를 사용하여 GNU 버전을 설치할 수 있습니다 brew install coreutils. 명령으로 사용할 수 있습니다 gdu.
neu242 2015-04-15

1
작동하지 않습니다. ls-> file.gz hardlink-to-file.gz. stat -c %s file.gz-> 9657212. stat -c %s hardlink-to-file.gz-> 9657212. du -sb-> 9661308. 확실히 콘텐츠의 총 크기는 아니지만 디렉토리가 디스크에서 차지하는 크기입니다.
anton_rh

24

디렉토리로 이동 한 다음 :

du -sh

ftw!

원래 여기에 썼습니다 : https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/


1
이것은 간단하고 작동합니다! 감사. 때로는 -L옵션 을 추가하고 du싶으 므로 심볼릭 링크를 따릅니다.
conradkleinespel 2014

2
나를 위해 작동 (OS X에서)
sam boosalis

2
이것은 간단하고 작동하지 않습니다. 각 파일을 열고 바이트를 계산하여 계산할 수있는 콘텐츠의 총 크기가 아니라 디렉터리가 디스크에서 차지하는 공간을 인쇄합니다.
anton_rh

17

대안 :

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

grep -v '^d' 디렉토리를 제외합니다.


4
완벽합니다. -a 매개 변수를 추가하여 "숨겨진 파일"(마침표로 시작하는 모든 항목)을 가져옵니다.
Nicholi 2011

더 읽기 쉽도록 MB에 (이 경우, PNG) 특정 파일 형식에 격리 표현 : ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice

정답입니다. du이 솔루션 과 달리 파일에있는 모든 데이터의 총 크기는 마치 하나씩 열리고 해당 바이트가 계산 된 것처럼 계산됩니다. 그러나 예, -A매개 변수를 추가하면 숨겨진 파일도 계산됩니다.
anton_rh

13

통계의 "% s"형식은 파일의 실제 바이트 수를 제공합니다.

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

숫자를 합산하는 대신 선호하는 방법으로 자유롭게 대체하십시오 .


4
특정 파일 이름 (공백 포함) 문제를 방지하려면 "find. -type f -print0 | xargs -0 ..."을 사용하는 것이 좋습니다.
hlovdal

1
네, 좋은 지적입니다. 그것이 bsd 4.2에 없었다면 나는 그것을 사용하는 것을 기억하지 않는다 :-(
Nelson

3
find -print0xargs -0공백 파일 이름을 위해 필요하다. OS X는 stat -f %z.
코넬

1
(stat는 스파 스 파일에서 작동하며, 보고서와 같은 디스크에서 사용되는 작은 블록이 아니라 파일의 큰 명목 크기를 du보고합니다.)
Nelson

1
du유틸리티 를 잘못 사용하는 다른 많은 답변과 달리이 답변은 정확합니다. 여기에 대한 답변과 매우 유사합니다 : unix.stackexchange.com/a/471061/152606 . 하지만 ! -type d대신에 -type f심볼릭 링크를 계산 하는 대신 사용할 것입니다 (심볼 링크 자체의 크기 (보통 몇 바이트), 가리키는 파일의 크기가 아닙니다).
anton_rh

3

emebedded 시스템에서 busybox의 "du"를 사용하면 du로 정확한 바이트를 얻을 수 없으며 얻을 수있는 KB 만 얻을 수 있습니다.

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)

3

폴더가 생성 될 때 많은 Linux 파일 시스템은 디렉토리 자체에 대한 일부 메타 데이터를 저장하기 위해 4096 바이트를 할당합니다. 이 공간은 디렉토리가 커짐에 따라 4096 바이트의 배수만큼 증가합니다.

du 명령 (-b 옵션 포함 또는 제외) 은 다음 과 같이 입력하는 것처럼 이 공간을 계산합니다 .

mkdir test && du -b test

빈 디렉토리에 대한 결과는 4096 바이트입니다. 따라서 dir 안에 10000 바이트의 파일 2 개를 넣으면 du -sb 가 제공하는 총량 은 24096 바이트가됩니다.

질문을주의 깊게 읽으면 이것은 질문 한 것이 아닙니다. 질문자는 다음과 같이 물었습니다.

각 파일을 열고 바이트를 계산하면 얻을 수있는 파일 및 하위 디렉터리의 모든 데이터의 합계

위의 예에서 24096이 아니라 20000 바이트 여야합니다.

따라서 정답 IMHO는 공백이 포함 된 파일 이름을 처리하기위한 Nelson 답변과 hlovdal 제안을 혼합 한 것일 수 있습니다 .

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

2

Linux / Unix 및 Windows 용 Git Bash에서 작동하는 "파일 및 하위 디렉터리의 모든 데이터 합계"를 바이트 단위로 가져 오는 방법에는 최소 세 가지 방법이 있습니다. 아래에 나열된 것은 평균적으로 가장 빠른 것에서 가장 느린 것입니다. 참고 docroot로이 파일은 상당히 깊은 파일 시스템의 루트에서 실행되었습니다 ( 30,027 개 디렉토리에 71,158 개 파일로 구성된 Magento 2 Enterprise 설치에서).

1.

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2.

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

삼.

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


이 두 가지도 작동하지만 Windows 용 Git Bash에없는 명령에 의존합니다.

1.

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2.

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


당신은 현재 디렉토리 전체를 원한다면, 추가 -maxdepth 1find.


제안 된 솔루션 중 일부는 정확한 결과를 반환하지 않으므로 대신 위의 솔루션을 고수합니다.

$ du -sbh
832M    .

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

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

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

1
Windows 용 망할 놈의 강타에 대해서, - Cygwin에서의 경우 dc의 일부입니다 bc, 그래서 패키지를 얻을 수dc 는 설치할 필요가있다 bc.
ruvim

1

Win32 DOS의 경우 다음을 수행 할 수 있습니다.

c :> dir / sc : \ directory \ you \ want

두 번째 줄은 파일이 차지하는 바이트 수를 알려줍니다.

나는 이것이 모든 파일과 디렉토리를 읽는다는 것을 알고 있지만 어떤 상황에서는 더 빨리 작동합니다.


1

du편리하지만 find일부 파일의 크기 만 계산하려는 경우에 유용합니다 (예 : 확장자 별 필터 사용). 또한 find자체적으로 각 파일의 크기를 바이트 단위로 인쇄 할 수 있습니다. 총 크기를 계산하기 dc위해 다음과 같은 방식으로 명령을 연결할 수 있습니다 .

find . -type f -printf "%s + " | dc -e0 -f- -ep

여기 find에서 dclike에 대한 일련의 명령을 생성합니다 123 + 456 + 11 +. 그러나 완성 된 프로그램은 다음과 같아야합니다 0 123 + 456 + 11 + p(접미사 표기법을 기억하십시오).

따라서 완성 된 프로그램을 얻으려면 0stdin에서 시퀀스를 실행하기 전에 스택 에 넣고 실행 후 맨 위 번호를 인쇄해야 p합니다 (마지막에 있는 명령). 우리는 dc옵션 을 통해이를 달성합니다 .

  1. -e0스택에 -e '0'넣는 지름길 일뿐입니다 0.
  2. -f-stdin ( find여기에서 생성됨)에서 명령을 읽고 실행하기위한 것입니다 .
  3. -ep결과를 인쇄하기위한 것입니다 ( -e 'p').

대신 포인트 3에서 284.06 MiB사용할 수있는 것처럼 크기를 MiB로 인쇄하려면 -e '2 k 1024 / 1024 / n [ MiB] p'(대부분의 공백은 선택 사항)


1

도움이 될 수 있습니다.

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

위의 명령은 디렉토리 크기를 떠나는 모든 파일을 합산합니다.


1
이 솔루션은 Barun 의 답변 과 매우 유사합니다 . 그러나이 솔루션은 하위 디렉터리의 파일을 합산하지 않습니다.
ruvim

1
@ruvim, 숨겨진 파일도 합산하지 않습니다. 숨겨진 파일을 합산하려면 -A옵션을에 추가해야합니다 ls.
anton_rh

0

사용하다:

$ du -ckx <DIR> | grep total | awk '{print $1}'

여기서 <DIR>은 검사 할 디렉토리입니다.

'-c'는 명령의 'grep total'부분을 사용하여 추출한 총계 데이터를 제공하며, KB 단위의 개수는 awk 명령으로 추출됩니다.

여기서 유일한주의 사항은 "total"이라는 텍스트를 포함하는 하위 디렉토리가있는 경우에도 튀어 나올 것입니다.

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