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

我需要找出networking上每个用户占用了多less磁盘空间。 我知道dfdu命令:我可以列出整个文件系统和AWK的输出,但我不知道是否有一个更标准的命令。

我正在寻找的输出是:

 usr1 xMb usr2 yMb [...] Total zMb 

有任何想法吗?

谢谢!

PS。 红帽Linux EE

这是一次性的事,还是这个信息,你想能够定期提取? 如果是以后那么一个选项是在你的文件系统上应用配额。 这样做,系统不断跟踪每个用户使用的数据量。 这样的信息只是对配额数据库的查询。

另一个很好的解决scheme,我发现 导航到感兴趣的目录,然后运行(或者更改到任何一个目录,例如/home/ )。

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

或者为了find问题的用户(目录太),

 du -xk | sort -n | tail -25 

和Solaris:

 du -dk | sort -n | tail -25 

这给你一个25个最大的目录列表。 不是你所要求的,但是我一直使用它。

我们在很多地方做的是使用配额制度,但是制定了荒谬的高额配额。 这样你就可以得到快速报告的好处。 在一个站点,每个用户拥有1TB的“配额”空间。

随着可用磁盘的增长,我们会定期提高配额 – 最初每个用户为30GB,这在当时是非常高的。

不存在这样的命令。 你必须为此写一些shell命令。

  1. 使用uid> 1000从/ etc / passwd获取所有用户
  2. 使用find -uid并search用户的所有文件
  3. 使用这个列表饲料du -s

ThorstenS的方法似乎是更多的工作,然后是我需要,因为它运行多次。 对于一个closures,我只需要执行1个查找命令,并输出每个文件的所有者和大小,然后对该文件进行一些sorting。

这个查找将返回一个空字节分隔的文件,返回用户名(或者没有用户名的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 

如果我们只search大于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