我们应该将正在进行的项目存储在一个相当小的(~4TB)数据服务器上。毫不奇怪,它不断溢出,人们需要手动移走不太新的文件。
有没有一种简单的(也称为标准命令行)方法来找出哪些用户占用目录中最多的空间?即总结目录中所有文件以及属于每个用户的所有子目录的大小?
编辑:理想情况下不遵循符号链接
答案1
要查看磁盘上所有用户的磁盘使用情况,可以使用以下脚本:
#! /bin/bash
DIRECTORY_TO_SCAN=/home
readarray -t user_list<<<"$(cat /etc/passwd | cut -d ':' -f 1)"
for u in "${user_list[@]}" ; do
printf "Scanning for user: %30s" "$u"
du -ch $(find "$DIRECTORY_TO_SCAN" -user "$u" 2>/dev/null) 2>/dev/null | sed -e '/total/!d;s/^/ /'
done
该脚本将扫描所有用户的列表,找到您可以读取的文件以及他们拥有的文件,并计算这些文件使用的总空间。
(为了完整起见,保留以下部分)
如果你想知道一个目录的完整大小,可以使用命令du
:
du -sh directory1 directory2
将打印目录的大小及其所有内容。
要真正解决您的问题,您可以使用用户(或组)配额。这将使您能够获得每个用户/组占用多少空间的详细报告,并设置关于他们可以使用多少空间的硬性限制。
答案2
在这种情况下,我通常首先du -kx | sort -rn | less
按最大优先的顺序列出目录。这告诉我最大的磁盘消耗在哪里,这样我就知道去哪里寻找。但正如 @SimonDoppler 所说,如果您至少无法r-x
访问所有子目录,您的列表将不完整:您将只能获取您能够访问的目录的大小。
请记住:通常您只需要拥有目录的写入权限即可删除其中的任何文件。仅当目录设置了sticky
位(即权限字母字符串中的最后一个字母是 at
而不是x
)时,您需要是文件的所有者才能删除它。
如果没有可用配额,您可能需要执行以下操作:
#!/bin/sh
if [ "$1" = "" ] || [ "$1" = "-h" ]
then
echo "Usage: ${0##*/} <directory> <username(s)...>" >&2
exit 64 # EX_USAGE
fi
if ! [ -d "$1" ]
then
echo "ERROR: directory $1 does not exist" >&2
exit 66 # EX_NOINPUT
fi
REPORTROOT="$1"
shift
for U in "$@"
do
# Find all files under $REPORTROOT owned by a particular user,
# get their sizes and sum them together.
DISKUSE=$(find "$REPORTROOT" -type f -user "$U" \
-exec stat -c %s {} \+ 2>/dev/null \
| awk '{s+=$1} END {printf("%ld\n", s)}')
# Display the result for this user.
printf "%16s: %d\n" "$U" "$DISKUSE"
done
请注意,运行它可能需要一段时间。
awk 的一句“计算一列数字的总和”来自这个堆栈溢出帖子。请注意答案的注释。