web-dev-qa-db-ja.com

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

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

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

usr1  xMb
usr2  yMb
[...]
Total zMb

何か案は?

ありがとう!

PS。 Red Hat Linux EE

10
Escualo

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

11
andol

私が見つけた別の素晴らしい解決策 here 。目的のディレクトリに移動して実行します(または、.興味のあるディレクトリに例:/home/):

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

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

du -xk | sort -n | tail -25

およびSolarisの場合:

du -dk | sort -n | tail -25   

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

3
Ronald Pottol

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

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

2

私はそれを作りました:)あなたは速くありませんが、うまくいきます:

#!/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
0
kolypto

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

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

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

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

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

\0タブや改行など、少し操作しやすいかもしれませんが、ファンキーなファイル名を使用している場合は安全性が低下します。

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

0
Kyle Brandt