私たちは進行中のプロジェクトをかなり小さい(〜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で「数値リストの合計を計算してください」という文は、次のようになります。このスタックオーバーフロー投稿。回答のコメントを参考にしてください。