본문 바로가기

별걸다하는 IT/리눅스 유닉스

[리눅스/유닉스] du 명령어, 디렉터리별 디스크 사용량 확인하기. 퍼센테이지 비율로 확인하기 , ls명령어와 크기가 다른 이유?

[리눅스/유닉스 완전정복 목차]

안녕하세요

오랜만에 리눅스/유닉스 카테고리 포스팅으로 돌아온 주인장 양햄찌입니다.

 

오늘은 파일시스템 용량에 가장 많이 쓰이는 df와 더불어, du명령어를 확인해보도록 해요.

df명령어는 파일시스템별로 메모리 사용량을 보여줬었죠?

du는 그보다 좀 세세하게 볼때, 파일 크기나, 디렉터리 크기를 확인하고 싶을 때 사용하는 명령어입니다.

파일시스템 메모리 사용량을 확인하는 df명령어가 궁금하신 분들은 아래 요 포스팅을 참조해주세요!

▼ df 명령어 뽀개기: https://jhnyang.tistory.com/138

 

[리눅스/유닉스 파일시스템] 디스크 사용량 확인하는 명령어 df 사용예시(현재 파일시스템, 옵션,

[Linux / Unix 완전 정복 목차] 안녕하세요~! 오늘은 유닉스 리눅스 명령어 중 용량 확인에 관한 명령어를 다룰거예요~! 가장 대표적인 명령어는 df와 du가 있는데 아무래도 예시사진이 많이 들어가면

jhnyang.tistory.com

들어가기 전.. 서론

업무를 하다보면 df와 du 명령어를 사용할 때가 참 많아요. 전 운영쪽이 아니라 개발쪽인대도 불구하고 말이죠 ㅎㅎ.

관리자쪽은 더 자주 사용하겠죠? 

일단, 대게 회사에서 사용하는 메모리라는건 결국 자원이기 때문에, 용도에 맞게 메모리를 할당해줍니다. 낭비하면 그것도 돈낭비~~ 운영쪽은 다운되면 위험하니, 대게 개발서버 쪽에 메모리를 아끼겠죠.? 

회사에서는 로그가 정말 엄청 다양하기 때문에, 어느부분이 FULL된건지 분석해야 하는 경우가 종종 발생합니다. (뭐 굳이 로그가 아니라도 메모리를 잡아먹는 원인은 여러가지가 있습니다만... 로그가 큰 용량을 차지하니....) 

의외로 툭하면 쓰게 되는 명령어가 df와 du예요. 전체적으로 파일시스템 별 용량을 체크하고 그 파일시스템 내부로 들어가서 디렉터리별로 체크해주는거죠. 그럼 어떤 업무에 메모리 증설이 필요하고, 어떤 부분에서는 메모리 정리 작업이 필요한지 간단명료하게 파악할 수 있겠죠~~!! 파악은 기본이야요 기본!

du 명령어

그런 의미에서 오늘은 du 명령어 사용법을 알아볼겁니다.

du명령어는 디렉터리별로 디스크 사용량을 알려주는 명령어예요. du는 하위 디렉터리부터 거꾸로 용량을 표시해줘요.

무슨말이냐.. a와 b디렉터리가 있고 a안에 aa라는 하위디렉터리와 ab라는 하위 디렉터리가 있을 때, 

a디렉터리 용량도 보여주고, a/aa 디렉터리 용량, a/ab 디렉터리 용량까지 쭉 내려가서 최하위 디렉터리까지 용량을 보여준단 얘기얘요.

실제 간단하게 디렉터리를 만들어서 테스트 해보면, 가장 포괄적인 a와 b디렉터리만 보여주는게 아니라 그 하위 디렉터리 사용량까지 표시해주고 있죠. 운영체제에 따라 다르지만 리눅스에서는 기본적으로 1024바이트(=1KB)가 기본 단위입니다. 

[운영체제별 결과가 다를 수 있다]

문법:  du [option] [FILE..]

AIX에서 du 명령어는 우분투 du 명령어와 차이가 있어요.

 

[AIX에서 man du했을 때 설명글]

The du command displays the number of blocks used for files. If the File parameter specified is actually a directory, all files within the directory are reported on. If no File parameter is provied, the du command uses the files in the current directory.

du 명령어는 파일들에 사용되는 블럭의 개수를 보여줍니다. 만약 du뒤에 디렉터리를 의미하는 파일변수가 붙으면, 디렉터리 내에 있는 모든 파일들을 대상으로 출력되고, File 변수 없이 du명령어만 쓰면 현재디렉터리에 있는 파일들을 대상으로 합니다.

AIX@server: ~/testdir/20200706 > du
0			./a/aa
0			./a/ab
0			./a
0			./b/ba
0			./b/bb
0			./b
16

결과로 보면 디렉터리 내에 파일이 비었거나 없으면, 결과를 0으로 표시합니다. 반면 리눅스에서는 파일이 빈파일이여도, 디렉터리가 빈 디렉터리여도 차지하는 용량을 표시해줘요. 

 

[ls 명령어와 크기가 다르다?]

자 위의 그림을 보면 test.c의 크기는 13으로 되어있는데 du 결과는 4예요. 왜 다르냐고요?!

ls 명령어는 실제 파일 사이즈를 의미한다면 du는 디스크에서 그 파일이 잡고 있는 블럭 즉 사용량을 의미해요. 출력해주는 크기라는 개념부터가 다르기 때문에 당연히 값은 다르답니다. 

파일 사이즈는 13byte인거고, 그 파일이 디스크내에서 잡아먹는 공간은 4KB인 셈인거죠. 왜 4KB이냐~

대게 디스크 기본 단위인 BLOCK 사이즈가 4KB이기 때문입니다. 그래서 두 파일 용량이 달라도 일정 크기 이하면 du 결과는 동일한거예요. 

du 옵션 (du OPTIONS)

바로~ 옵션을 알아봅시다.

리눅스에는 요오오렇게 많은 옵션들이 있는데요. 몇번이고 말해서 이미 다 아시겠지만, UNIX냐 리눅스냐, 운체가 뭐냐에 따라 지원하는 옵션이 다르기 때문에 man이나 help 명령어로 확인해주는 습관을 들입시당. 뭐 같은 작업환경이면 맨날 쓰던거만 쓰게 되기는 하지만요 ㅎㅎ

옵션 의미
-a (--all) du는 디렉터리만 표시해줬잖아요. a옵션을 사용하면 파일들까지도 사용량을 표기해줍니다.
-b (--bytes) 기본단위가 1KB였다면 이 옵션은 바이트(1b)단위로 출력해줍니다.
-k (--kilobytes) 디폴트 값이죠. 1KB 단위로 표시합니다 
-m (--megabytes) 1MB를 기본 단위로 표시합니다. 
-B (--block-size=SIZE) 지정한 블록 크기(SIZE) 단위로 용량을 출력합니다.
-h (--human-readable) 사람이 읽기 좋게 파일단위를 표시해줘요. 큰파일은 3M, 작은파일은 1K 이런식으로 맞춰서 변환.  (AIX에는 없는 옵션)
-d (--max-depth) 몇 단계 하위 디렉터리까지 출력할지 지정합니다. (AIX에는 없는 옵션)
-s (--summarize) 용량의 합계를 보여줍니다. 
-X (--exclude-from=FILE) FILE 패턴과 매칭되는 파일들을 제외한 결과를 보여줍니다. 

AIX운영체제에서는 기준이 1KB가 아니라 512bytes 즉 한 블럭이 출력값의 기준이 됩니다.

또 -b, -h, -d 옵션이 없는 등 상이하니 앞서 말했던 대로 체크 필수!

실행 결과를 보면서, 대표적인 몇개 옵션을 살펴볼까요~

사용 예시 Examples

기본 옵션 사용법

1. -a옵션

 

du -a [디렉터리/파일명]

디렉터리 용량뿐 아니라 파일까지 출력해주는 -a옵션입니다

du만 했을 때는 초록색으로 표시된 파일 사용량이 출력되지 않았지만, -a옵션을 주니까 현재 디렉터리내 파일뿐만 아니라 하위 디렉터리 파일 용량까지 출력해주는 것을 볼 수 있어요.

뒤에 디렉터리 경로를 붙이면, 해당 디렉터리 이하의 사용량들을 출력해주고, -a 옵션 뒤에 파일명을 붙여주면 해당 파일의 디스크 사용량을 보여줍니다.

 

[AIX에서 결과값]

AIX@server: ~/testdir/20200706 > du
0			./a/aa
0			./a/ab
0			./a
0			./b/ba
0			./b/bb
0			./b
16			.
AIX@server: ~/testdir/20200706 > du -a
0			./a/aa
0			./a/ab
0			./a
0			./b/ba
0			./b/bb
0			./b
8			./test1.class
8			./test1.java
16			.
AIX@server: ~/testdir/20200706 >

 

2. -s 옵션

 

du -s [디렉터리/파일명]
du -s /devhome/ubuntu/testdir/20200706

하위 디렉터리를 포함한 현재 모든 총 용량을 보여줍니다.

뒤에 옵션 대상 경로를 지정해주지 않으면 현재 시스템 총 사용량만 보여줘요,

뒤에 특정 디렉터리나 파일을 지정하면, 해당 디렉터리나 파일의 디스크 총 사용량만 보여줍니다.

근데 뒤에 '모든'을 나타내는 *를 사용해서 경로를 표시하면, 그 경로에 있는 모든 파일 및 디렉터리에 대해 사용량을 표시해줍니다.

 

3. --exclude 옵션 (리눅스)

특정 패턴과 일치하는 결과를 제외합니다.

$ du -ah --exclude="*.txt" /devhome/testdir/20200706

파일과 디렉터리의 모든 사용량을 보여주는데, txt로 끝나는 파일은 제외합니다.

 

응용 예시

 

■ 하위디렉터리 제외하고 현재 디렉터리 내에서의 파일과 디렉토리의 디스크 사용량 확인하기

$ du -hs ./*
$ du -hd 0 ./*

 

$ du -hs ./*

-h 옵션은 사람이 보기 편한 단위로 알아서 치환해서 보여주는 옵션이예요. 메가바이트로 떨어지면 M로 표시해주고 키로바이트면 K 기가바이트면 G 등 단위에 맞춰서 보기 쉽게 변환해줍니다. 499993231 이런 크기는 가늠하기가 어렵잖아요? 뒤에 asterisk(*)를 사용하면 해당 경로내에 디렉터리와 파일의 사용량을 보여줍니다.

$ du -hd 0 ./*

d는 depth 말그래도 얼마의 깊이만큼 들어갈거냐를 정해줍니다. depth가 0이면 현재디렉터리의 디스크 사용량을 표시해줍니다. 

만약 `$ du -hd 1 ./*` 명령어를 쳤다면 './a', './a/aa', './a/ab' 등과 같이 하위 디렉터리 한 번 더 내려간 결과들을 포함해 출력해줍니다.

그런데, AIX와 같은 유닉스에서는 h나 d 옵션이 없죠. h를 뺀 `du -s ./* `로 디스크사용량을 확인해줍시다.

 

■ 출력되는 결과로 파일 빼고 디렉터리 디스크 사용량만 보고 싶을 때

위의 경우엔 파일도 결과에 추가시켜요. 만약 현재디렉터리에 파일과 디렉터리가 같이 있는데 파일의 개수가 느~~므 많다면 결과를 한 눈에 보기 불편하겠죠. 디렉터리 별로 묶어서 깔끔하게 보고 싶을그예요. 

 

$ du -s ./*/

간단하게 앞의 예시에서 '/'를 추가함으로써 '디렉터리만'을 추출할 수 있습니다. 이 경우 ./*/ 형태만 뽑는거기 때문에 '.'에 해당하는 총 사용량은 출력되지 않습니다.

■ 하위디렉터리 제외하고 현재 디렉터리 내 디렉토리별 디스크 사용량 확인 + 총 디스크 사용량 포함

 

$ du | awk -F / 'NF <=2'

 

'/' 기호를 기준으로 잘랐을 때 필드개수가 2개 이하인 것들만 뽑아 출력하는 명령어입니다.

 

■ 퍼미션 디나이드(Permission denied)와 같은 에러 출력은 버리고 정상 결과만 출력하기

 

$ du -hs ./* 2> /dev/null 

 

du를 실행하면 root권한이 아닌 이상 접근이 허용되지 않은 디렉터리가 있을 수 있어요.

그런데서 du하면 이렇게 Permision denied 에러가 지저분하게 막 출력되는데.. 너무 보기 안좋죠. 이렇게 에러나는 거는 '2> /dev/null'명령어를 통해서 없애버립시다. 

결과가 깔끔해졌어요~! 

 

■ 현재 폴더에 있는 디렉터리 중 용량이 큰 순서대로 10개 보기 

 

$ du -hs ./* | sort -hr | head -10

 

sort 옵션을 사용하면 깔끔하게 정렬할 수 있습니다.

 

■ 퍼센테이지 계산

현재 디렉터리에서 가장 많은 사용량을 차지하는 디렉터리를 퍼센테이지(%)로 한 눈에 볼 수 있으면 파악하기 쉽겠죠.

du -s ./*/ | awk -v TOTAL=`du -s | awk '{print $1}'` '{printf "%s\t%s\t%0.3f %\n",$1,$2,$1/TOTAL*100}'
echo "TOTAL: `du -s`"

 

shell로 만들어서 alias걸어두면 그때그때 활용하기 좋겠죠?

오늘은 여기까지 준비해봤어요 ㅎㅎ

고생하셨습니다. 다음에 또 봐요 :)