Linux / Unixでのユーザーあたりのディスク使用量


10

ネットワーク上の各ユーザーが使用しているディスク容量を調べる必要があります。私はdfduコマンドを認識しています。ファイルシステム全体と出力のAWKをリストすることはできますが、もっと標準的なコマンドがあるかどうか疑問に思います。

私が探している出力は次のとおりです。

usr1  xMb
usr2  yMb
[...]
Total zMb

何か案は?

ありがとう!

PS。Red Hat Linux EE

回答:


11

これは一度限りのものですか、それともこの情報を定期的に抽出できるようにしたいですか?後者の場合、1つのオプションはファイルシステムにクォータを適用することです。これにより、システムは各ユーザーが使用するデータ量を継続的に追跡します。このように、情報はクォータデータベースへのクエリにすぎません。


1
+1クォータが解決策です!
ThorstenS

一時的なこと。おそらく、ユーザーが必要に応じて使用量を計算するための小さなスクリプトに格納できるソリューション。私たちが行う作業のタイプはハード制限に対応していないため、データ量を制限することはできません。
Escualo、2009

@ThorstenS:テクニカルコンピューティングを行っており、実行後に削除される場合と削除されない場合がある大量の情報を生成する必要があります。割り当ては私たちの状況では役に立たないと思います。
Escualo、2009

1
@Arrieta:使用を制限する必要はありません。各ユーザーに途方もなく高い割り当てを与えるだけです。また、すべてのユーザーが自分でクォータデータベースにクエリを実行し、現在保存しているデータ量を確認できます。
andol

2
クォータを大きな値に設定する必要すらありません。未設定(つまり0)のままにすると、強制されませんが、使用量が記録されます
Daniel

4

私がここで見つけた別の素晴らしい解決策。関心のディレクトリ、および実行に移動し(あるいは、変化する.方のディレクトリ利益にあなたが、例えば/home/):

find . -type f -printf "%u  %s\n" \
  | awk '{user[$1]+=$2}; END{for(i in user) print i,user[i]}'

1
+1。多分-type fを追加しますか?本当にファイルを探しているだけですか?
Hennes

いい答えです。使用-printf "%u\t%s\n"してawk -v OFS="\t"あなたが考える場合は、これまでにスペースを持つユーザ名を持っているかもしれません。
TheDudeAbides

3

または、問題のあるユーザー(ディレクトリも)を見つけるために、

du -xk | sort -n | tail -25

そしてSolarisの場合:

du -dk | sort -n | tail -25   

これにより、25の最大ディレクトリのリストが表示されます。あなたが求めていたものではありませんが、私はいつもそれを使用しています。


2

多くの場所で私たちがしていることは、割り当てシステムを使用することですが、とんでもなく高い割り当てを設定します。このようにして、高速レポートの利点を活用できます。1つのサイトでは、各ユーザーに1 TBの「クォータ」スペースがあります。

私たちは定期的に、サービス可能なディスクが大きくなるにつれて割り当て量を増やしています-最初はユーザーあたり30GBで、当時はとてつもなく高かったものです。


0

そのようなコマンドはありません。そのためには、いくつかのシェルコマンドを記述する必要があります。

  1. / etc / passwdからuid> 1000ですべてのユーザーを取得する
  2. find -uidを使用して、ユーザーのすべてのファイルを検索します
  3. このリストを使用してdu -sをフィード

非効率的な。情報を同時にログに記録する場合、findを複数回実行する必要はありません。最初の実行時にその情報を保存します。ファイルまたは連想配列のいずれかです。
Hennes、2014

0

ThorstenSの方法は、findが複数回実行されるため、私にはさらに多くの作業が必要と思われます。1回限りの場合は、1つのfindコマンドを実行し、各ファイルの所有者とサイズを出力してから、そのファイルに対して何らかの魔法をかけます。

検索結果は、ヌルバイト区切りファイルで、ユーザー名(またはユーザー名のないID番号)と使用されたスペースをバイトで返すようなものです。

sudo bash -c 'find . -printf "%u\0%s\0" > username_usage'

\0は、タブや改行など、操作が少し簡単なものに置き換えることができますが、ファンキーなファイル名を使用している場合は安全性が低くなります。

さらに効率的にしたい場合は、実行時に出力を処理するスクリプトに出力をパイプすることができますが、これは少し手間がかかり、最初は正しく実行する必要があります。


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.