Linux / Unix中每个用户的磁盘使用率


10

我需要找出网络上每个用户占用了多少磁盘空间。我知道dfand du命令:我可以列出整个文件系统,并AWK输出,但是我想知道是否有更标准的命令。

我正在寻找的输出是:

usr1  xMb
usr2  yMb
[...]
Total zMb

有任何想法吗?

谢谢!

PS。红帽Linux EE

Answers:


11

这是一次性的事情,还是您希望能够定期提取的信息?如果是较晚的情况,那么一个选择是在文件系统上应用配额。这样做,系统会持续跟踪每个用户使用的数据量。这样,信息仅是对配额数据库的查询。


1
+1配额是解决方案!
ThorstenS

一次性的事情;可能是一种解决方案,可以将其存储在小脚本中,以便用户根据需要计算其使用量。由于我们无法完成的工作类型,我们无法限制数据量。
Escualo

@ThorstenS:我们进行技术计算,我们需要生成大量信息,这些信息在运行后可能会或可能不会被删除。我认为配额对我们的情况没有帮助。
Escualo

1
@Arrieta:您不必限制它们的使用。只需给每个用户一个高得离谱的配额。此外,每个用户都可以自己查询配额数据库,并查看他们当前正在存储多少数据。
andol

2
您甚至不需要将配额设置为一个大数字,如果您将其设置为未设置(即0),它将不会强制执行该配额,但是它将记录使用情况
丹尼尔(Daniel)2009年

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 TB的“配额”空间。

随着可使用磁盘的增加,我们会定期提高配额-最初每个用户30GB,这在当时是荒唐的。


0

没有这样的命令。您必须为此编写一些shell命令。

  1. 从/ etc / passwd使用uid> 1000获取所有用户
  2. 使用find -uid并搜索用户的所有文件
  3. 使用此列表喂du -s

效率低下。如果您同时记录信息,则无需多次运行find。在第一次运行时保存该信息。在文件中或在关联数组中。
Hennes

0

ThorstenS的方法似乎需要我做更多的工作,因为它多次运行。对于一次关闭,我只需要执行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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.