找出哪些用户占用了我们数据服务器上最多的磁盘空间

找出哪些用户占用了我们数据服务器上最多的磁盘空间

我们应该将正在进行的项目存储在一个相当小的(~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 的一句“计算一列数字的总和”来自这个堆栈溢出帖子。请注意答案的注释。

相关内容