回答:
これは一度限りのものですか、それともこの情報を定期的に抽出できるようにしたいですか?後者の場合、1つのオプションはファイルシステムにクォータを適用することです。これにより、システムは各ユーザーが使用するデータ量を継続的に追跡します。このように、情報はクォータデータベースへのクエリにすぎません。
私がここで見つけた別の素晴らしい解決策。関心のディレクトリ、および実行に移動し(あるいは、変化する.
方のディレクトリ利益にあなたが、例えば、/home/
):
find . -type f -printf "%u %s\n" \
| awk '{user[$1]+=$2}; END{for(i in user) print i,user[i]}'
-printf "%u\t%s\n"
してawk -v OFS="\t"
あなたが考える場合は、これまでにスペースを持つユーザ名を持っているかもしれません。
多くの場所で私たちがしていることは、割り当てシステムを使用することですが、とんでもなく高い割り当てを設定します。このようにして、高速レポートの利点を活用できます。1つのサイトでは、各ユーザーに1 TBの「クォータ」スペースがあります。
私たちは定期的に、サービス可能なディスクが大きくなるにつれて割り当て量を増やしています-最初はユーザーあたり30GBで、当時はとてつもなく高かったものです。
そのようなコマンドはありません。そのためには、いくつかのシェルコマンドを記述する必要があります。
ThorstenSの方法は、findが複数回実行されるため、私にはさらに多くの作業が必要と思われます。1回限りの場合は、1つのfindコマンドを実行し、各ファイルの所有者とサイズを出力してから、そのファイルに対して何らかの魔法をかけます。
検索結果は、ヌルバイト区切りファイルで、ユーザー名(またはユーザー名のないID番号)と使用されたスペースをバイトで返すようなものです。
sudo bash -c 'find . -printf "%u\0%s\0" > username_usage'
\0
は、タブや改行など、操作が少し簡単なものに置き換えることができますが、ファンキーなファイル名を使用している場合は安全性が低くなります。
さらに効率的にしたい場合は、実行時に出力を処理するスクリプトに出力をパイプすることができますが、これは少し手間がかかり、最初は正しく実行する必要があります。
私はそれを作りました:)あなたは速くありませんが、うまくいきます:
#!/bin/bash
# Displays disk usage per user in the specified directory
# Usage: ./scriptname [target-directory]
[ "x$1" == "x" ] && dirname="." || dirname="$1"
for uid in `cat /etc/passwd |awk -F : '{ print $1 }' ` ; do # List all usernames
user_size=0
for file in `find "$dirname" -type f -user "$uid" 2>/dev/null` ; do # List the folder's files that belongs to the current user, Ignore possible `find` errors.
let user_size+=`stat -c '%s' $file` # Sum-up
done
[ $user_size -gt 0 ] && echo "USER=$uid, SIZE=$user_size" # Display the result if >0
done
1000を超えるUIDのみを検索すると、速度が大幅に向上します。
- for uid in `cat /etc/passwd | sed -rn "s~^([^:]+):.*$~\1~p"` ; do # List all usernames
+ for uid in `cat /etc/passwd | sed -rn "s~^([^:]+):[^:]:[0-9]{4,}:.*$~\1~p"` ; do # List all usernames having UID>1000