server-memo.net

サイズの大きなファイルやディレクトリを調べる方法

   

「find」コマンドを使用する方法と、「du」コマンドを使用する方法の2種類について説明しています。

指定したサイズ以上のファイルを探す

「find」コマンド「-size」オプション使用し、「xargs」コマンドと組み合わせることで指定したサイズより大きいデータを探す事ができます。

書式

find [検索を行いたいディレクトリ] -size +[データサイズ] | xargs ls -l | sort -rn

実行例

「/home」ディレクトリ内でサイズが300M以上のデータを検索してみた実行例です。

# find /home -size +300M | xargs ls -l | sort -rn
-rw-rw-r-- 1 tamohiko tamohiko 1073741824  2月 23 17:02 /home/tamohiko/scp_test/1G
-rw-r--r-- 1 root     root     1000000000  7月  8 17:39 /home/test/1G
-rw-r--r-- 1 root     root      500000000  7月  8 17:40 /home/test2/500M

検索を行いたいディレクトリを変更したい場合は、「/home」の部分を変更することで検索ディレクトリの変更ができます。

検索するデータのサイズを変更したい場合は「300M」の部分を変更することで、データの大きさを変更することが出来ます。

サイズが大きい順に表示させる

「du」コマンドと「sort -rn」コマンドを組み合わせることで、サイズが大きいファイルやディレクトリを大きい順に表示させることが出来ます。

また、「head」コマンドを組み合わせることで、表示させる行数を指定することもできます。

書式

サブディレクトリ内のディレクトリも表示させる場合

du -k /[ディレクトリ名]/* | sort -rn | head -[表示させたい行数]

サブディレクトリ内のディレクトリは表示させない場合

du -sk /[ディレクトリ名]/* | sort -rn | head -[表示させたい行数]

「-s」オプションがある場合とない場合の比較

「du」コマンドに「-s」オプションを付けるか付けないかで表示結果が異なりますので、実際に「/etc」ディレクトリを検索対象として表示結果を比較してみます。

「-s」オプションなし

「/etc」内のサブディレクトリ内の中にあるディレクトリまで表示されています。

# du -k /etc/* | sort -rn | head -10
11572   /etc/selinux
11564   /etc/selinux/targeted
6204    /etc/udev
5668    /etc/selinux/targeted/modules/active
5668    /etc/selinux/targeted/modules
4828    /etc/selinux/targeted/modules/active/modules
3688    /etc/selinux/targeted/policy
2188    /etc/selinux/targeted/contexts
2092    /etc/selinux/targeted/contexts/files
1472    /etc/pki
「-s」オプションあり

「/etc」ディレクトリ内のサブディレクトリまでしか表示され無いため、サブディレクトリごとのデータサイズが分かりやすいです。

# du -sk /etc/* | sort -rn | head -10
11572   /etc/selinux
6204    /etc/udev
1472    /etc/pki
656     /etc/services
344     /etc/sysconfig
280     /etc/ssh
260     /etc/asciidoc
240     /etc/munin
164     /etc/httpd
156     /etc/lynx.cfg

このように「-s」オプションがあるかないかで、表示内容が変わってくるので用途によって使い分けて下さい。

たとえば、「/home」ディレクトリでどのユーザがデータをため込んでいるかを調べる場合は「-s」を付けるとか、ユーザのホームディレクトリ内のどのディレクトリにデータが多く格納されているのかを確認したい場合は、「-s」オプションを付けないといったように、使い分けが必要になってきます。

duコマンド説明

「-k」オプションはサイズの単位をKB単位で表示させています。「-m」でMB単位での表示とかも可能ですが、「-h」オプションはサイズの単位が混在してしまい、ソートの結果が狂ってしまうので使用しないでください。

調査するディレクトリ名の後にある「*」は、調査対象ディレクトリのサイズを表示せないためにつけています。

sortコマンド説明

「-n」オプションは、先頭の数字や記号を数値とみなしてソートさせます。

「-r」オプションは、ソートした順序を逆にして表示させます。

du -sk /[ディレクトリ名]/* | sort -rn | head -[表示させたい行数]

「-s」オプションはサブディレクトリは表示させずに、指定されたディレクトリの合計容量を表示させます。

実行例

ホームディレクトリに大量のデータをため込んでいるユーザTOP5を表示させてみた例です。

# du -sh /home/* | sort -rn | head -5
954M    /home/test
512M    /home/test2
429M    /home/test3
287M    /home/test4
191M    /home/test5

こんな感じで、データをため込んでいるユーザを一発で発見することが出来ます。

チェックスクリプト

スクリプトを作成し「cron」に登録することで、毎日自動的にデータ量を確認することが出来ます。

変数説明

設定が必要な変数の説明です。

変数 設定内容
CKDIR チェック対象ディレクトリを設定
DIS_NUM 表示させたい件数を設定
MAILADDR 結果を送りたいメールアドレスを設定

スクリプト

作成したスクリプトに実行権限をつけるのを忘れないでくださいね。

#!/bin/bash

# check dirctory
CKDIR=/home

# display number
DIS_NUM=10

# send mail address
MAILADDR=tamohiko@gmail.com

# run date
DAY=`date +"%Y-%m-%d"`

# mail subject
MAILSUB="$DAY $CKDIR Space Use User TOP $DIS_NUM"


# disk check command
/bin/du -sm $CKDIR/* | sort -rn | head -$DIS_NUM | mail -s "$MAILSUB" $MAILADDR

 - Tips