データサーバーでどのユーザーが最も多くのディスク容量を占めているかを確認します。

データサーバーでどのユーザーが最も多くのディスク容量を占めているかを確認します。

私たちは進行中のプロジェクトをかなり小さい(〜4 TB)データサーバーに保存することになっています。当然、ファイルがあふれ、新しくないファイルを手動で移動する必要がありました。
どのユーザーがディレクトリ内で最も多くのスペースを占有しているかを調べる簡単な(または標準のコマンドライン)方法はありますか?つまり、ディレクトリ内のすべてのファイルと各ユーザーに属するすべてのサブディレクトリのサイズを合計しますか?

編集:理想的にはシンボリックリンクに従わないことをお勧めします。

答え1

ディスク上のすべてのユーザーのディスク使用量を表示するには、次のスクリプトを使用できます。

#! /bin/bash

DIRECTORY_TO_SCAN=/home

readarray -t user_list<<<"$(cat /etc/passwd | cut -d ':' -f 1)"

for u in "${user_list[@]}" ; do
        printf "Scanning for user: %30s" "$u"
        du -ch $(find "$DIRECTORY_TO_SCAN" -user "$u" 2>/dev/null) 2>/dev/null | sed -e '/total/!d;s/^/    /'
done

スクリプトはすべてのユーザーのリストを検索し、読み取り可能なファイルとユーザーが所有するファイルを検索し、そのファイルが使用する合計スペースを計算します。


(完全性のために、次のセクションが維持されます)

ディレクトリの合計サイズを知りたい場合は、次のコマンドを使用できますdu

du -sh directory1 directory2

ディレクトリのサイズとすべての内容を印刷します。

実際に問題を解決するには、次のものを使用できます。ユーザー(またはグループ)クォータ。これにより、各ユーザー/グループが占めるスペースの詳細なレポートを取得し、使用できるスペースに厳しい制限を設定できます。

答え2

この場合、一般的には、du -kx | sort -rn | less最も大きいものから順にディレクトリを最初にリストします。これにより、最大のディスク消費が発生する場所を知ることができ、どこを見るべきかを知ることができます。ただし、@SimonDopplerが言ったように、少なくともr-xすべてのサブディレクトリにアクセスできない場合、リストは完全ではありません。アクセスできるディレクトリのサイズだけが取得されます。

覚えておいてください:通常、ディレクトリ内のファイルを削除するには、ディレクトリへの書き込み権限のみが必要です。ディレクトリにstickyビットが設定されている場合(つまり、権限文字列の最後の文字が代わりにt)の場合にのみ、xそのファイルを削除するには、そのファイルの所有者である必要があります。

使用可能なクォータがない場合は、次のことを行う必要があります。

#!/bin/sh
if [ "$1" = "" ] || [ "$1" = "-h" ]
then
    echo "Usage: ${0##*/} <directory> <username(s)...>" >&2
    exit 64 # EX_USAGE
fi
if ! [ -d "$1" ]
then
    echo "ERROR: directory $1 does not exist" >&2
    exit 66 # EX_NOINPUT
fi

REPORTROOT="$1"
shift
for U in "$@"
do
    # Find all files under $REPORTROOT owned by a particular user,
    # get their sizes and sum them together.
    DISKUSE=$(find "$REPORTROOT" -type f -user "$U" \
        -exec stat -c %s {} \+ 2>/dev/null \
        | awk '{s+=$1} END {printf("%ld\n", s)}')
    # Display the result for this user.
    printf "%16s: %d\n" "$U" "$DISKUSE"
done

実行に時間がかかることがあります。

awkで「数値リストの合計を計算してください」という文は、次のようになります。このスタックオーバーフロー投稿。回答のコメントを参考にしてください。

関連情報