파일처리_23 디렉터리에 있는 서브 디렉터리들의 디스크 사용량 조사하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: du, sort
키워드: 디스크 사용량, 파일 크기
사용처: 디렉터리마다 디스크 사용량을 표시하고 싶을 때


실행예제

$ ./du-sub.sh
29116	/home/user1/myapp/data/dir1/
4716	/home/user1/myapp/data/dir2/
1020	/home/user1/myapp/data/dir3/

스크립트

#!/bin/sh

data_dir="/home/user1/myapp/data"

# $data_dir 디렉터리의 서브디렉터리 용량 표시
du -sk ${data_dir}/*/ | sort -rn  #-------- 1

   

해설

이 스크립트는 셸 변수 data_dir로 지정한 디렉터리에서 서브 디렉터리들의 디스크 사용량을 조사합니다. data 디렉터리에는 dir1, dir2, dir3이라는 세 디렉터리가 있고 드 안에는 많은 파일과 디렉터리가 있다고 가정합니다.

data
├── dir1
├── dir2
└── dir3

디스크 사용량을 조사하려면 du 명령어를 사용합니다. 조금 다루기 어려운 명령어 이므로 상세히 알아봅시다. 우선 du 명령어에 표시되는 값을 알아보겠습니다. du 명령어로 표시되는 값은 파일 크기가 아니라 파일이 디스크에서 사용하는 블록 크기입니다. 블록 크기는 환경에 따라 값이 다르므로 셸 스크립트에서 du 명령어를 사용할 때는 -k 옵션(킬로바이트 단위)이나 -m 옵션(메가바이트 단위)으로 표시하도록 지정하는 것이 좋습니다.

예를 들어 다음 환경에서는 블록 크기가 512바이트이므로 -k 옵션으로 1024 바이트 단위로 표시하면 표시되는 값은 반이 됩니다.

  • -k 옵션을 쓰면 킬로바이트 단위로 표시
    $ du
    1544
    $ du -k
    772
    

du 명령어를 인수 없이 실행하면 현재 디렉터리 아래에 있는 디렉터리를 대상으로 각각 사용하는 디스크 사용량을 표시합니다.

  • du 명령어를 그냥 실행하면 서브디렉터리도 표시
    $ cd /home/user1/myapp/data
    $ du
    29116	./dir1
    8	    ./dir3/controller
    8	    ./dir3/agent
    1020	./dir3
    4716	./dir2
    35856	.
    

dir3이라는 디렉터리에는 controller와 agent라는 서브 디렉터리가 있어서 결과에 표시됩니다. 하지만 일반적으로 이렇게 표시하면 보기 힘들어지므로 dir3으로 합쳐서 사용량을 표시하고 싶을때 이 예제를 사용합니다.

1에서는 du 명령어에 -s옵션을 사용합니다. 실제로 인수로 지정한 대상의 디스크 사용량만 표시하고, 서브 디렉터리의 사용량은 표시하지 않는 옵션입니다. 1에서 -s 옵션에 /*/ 인수를 넘기므로 서브 디렉터리마다 용량을 표시합니다. 또한 -k 옵션도 함께 지정해서 킬로바이트 단위로 표시합니다.

그리고 du 명령어 출력 결과를 파이프를 통해 -r 옵션을 지정한 sort 명령어에 넘기면 사용량이 많은 것부터 표시할 수 있습니다. 이때 -n 옵션도 함께 써서 문자열 정렬이 아닌 숫자 정렬을 합니다. -n 옵션을 쓰지 않으면 문자열 정렬이 되므로 이런 숫자값을 내림차순으로 정렬할 때는 -rn을 자주 사용합니다.

   

du 명령어 -h 옵션

du 명령어는 -h(human-readable) 옵션을 쓰면 킬로바이트(K)나 메가바이트(M) 같은 단위로 사용량을 읽기 쉽게 표시할 수 있습니다.

$ du -h
29M	    ./data/dir1
8.0K	./data/dir3/controller
8.0K	./datadir3/agent
1020K	./data/dir3
4.7M	./data/dir2
36M	    ./data
36M	    .

이렇듯 -h 옵션을 쓰면 보기 좋아지지만 sort 명령어로 사용량을 정렬할 수 없게 됩니다. 따라서 셸 스크립트에서 정렬할 때는 그다지 쓰지 않습니다.

한편, 일부 리눅스 sort 명령어는 -h(–human-numeric-sort) 옵션이 있어서 2K, 1G 같은 du 명령어의 -h 옵션 출력값을 바르게 정렬할 수 있습니다.