我需要找出networking上每个用户占用了多less磁盘空间。 我知道df和du命令:我可以列出整个文件系统和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命令。
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