Answers:
这是一次性的事情,还是您希望能够定期提取的信息?如果是较晚的情况,那么一个选择是在文件系统上应用配额。这样做,系统会持续跟踪每个用户使用的数据量。这样,信息仅是对配额数据库的查询。
我们在许多地方所做的就是使用配额系统,但是设置了很高的配额。通过这种方式,您可以获得快速报告的好处。在一个站点上,每个用户都有1 TB的“配额”空间。
随着可使用磁盘的增加,我们会定期提高配额-最初每个用户30GB,这在当时是荒唐的。
ThorstenS的方法似乎需要我做更多的工作,因为它多次运行。对于一次关闭,我只需要执行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