데이터 서버에서 어떤 사용자가 가장 많은 디스크 공간을 차지하고 있는지 알아보세요.

데이터 서버에서 어떤 사용자가 가장 많은 디스크 공간을 차지하고 있는지 알아보세요.

우리는 진행 중인 프로젝트를 상당히 작은(~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비트가 설정된 경우(즉, 권한 문자 문자열의 마지막 문자가 대신 t) 인 경우에만 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에서 "숫자 목록의 합을 계산하세요"라는 문장은 다음에서 유래합니다.이 스택 오버플로 게시물. 답변의 의견을 참고하시기 바랍니다.

관련 정보