Linux / Unix에서 사용자 당 디스크 사용량 디스크 공간이 얼마나되는지 알아야합니다. 나는 알고 df있으며

네트워크의 각 사용자가 차지하는 디스크 공간이 얼마나되는지 알아야합니다. 나는 알고 df있으며 du명령 : 전체 파일 시스템과 AWK 출력을 나열 할 수 있지만 더 표준적인 명령이 있는지 궁금합니다.

내가 찾고있는 결과는 다음과 같습니다

usr1  xMb
usr2  yMb
[...]
Total zMb

어떤 아이디어?

감사!

추신. Red Hat Linux EE



답변

이 정보는 한 번입니까, 아니면 정기적으로 추출 할 수있는 정보입니까? 나중에 발생하는 경우 파일 시스템에 할당량을 적용하는 것이 하나의 옵션입니다. 시스템은 지속적으로 각 사용자가 사용하는 데이터의 양을 추적합니다. 그렇게하면 정보는 단순히 할당량 데이터베이스에 대한 쿼리 일뿐입니다.


답변

내가 여기서 찾은 또 다른 좋은 해결책 . 이동 관심의 디렉토리 및 실행하려면 (또는 변경 .중 디렉토리 이익에 당신이, 예를 들어 , /home/) :

find . -type f -printf "%u  %s\n" \
  | awk '{user[$1]+=$2}; END{for(i in user) print i,user[i]}'


답변

또는 문제가있는 사용자 (디렉토리도)를 찾기 위해

du -xk | sort -n | tail -25

그리고 Solaris의 경우 :

du -dk | sort -n | tail -25

25 개의 가장 큰 디렉토리 목록이 제공됩니다. 당신이 요구 한 것은 아니지만, 나는 항상 그것을 사용합니다.


답변

여러 곳에서하는 일은 할당량 시스템을 사용하는 것이지만 엄청나게 높은 할당량을 설정합니다. 이렇게하면 빠른보고 기능을 활용할 수 있습니다. 한 사이트에서 각 사용자는 1TB의 “quota”공간을 갖습니다.

서비스 가능한 디스크가 커짐에 따라 할당량을 주기적으로 높였습니다. 처음에는 사용자 당 30GB로 당시에는 엄청나게 높았습니다.


답변

그러한 명령은 없습니다. 이를 위해 몇 가지 쉘 명령을 작성해야합니다.

  1. uid> 1000으로 / etc / passwd에서 모든 사용자를 가져옵니다.
  2. find -uid를 사용하고 사용자의 모든 파일을 검색하십시오.
  3. 이 목록을 사용하여 du -s를 먹이십시오.

답변

ThorstenS의 방법은 여러 번 찾기 실행되므로 더 많은 작업이 필요한 것 같습니다. 일단은 찾기 명령 하나를 수행하고 각 파일의 소유자와 크기를 출력 한 다음 해당 파일에서 일종의 마술을 수행합니다.

find는 null 바이트로 구분 된 파일에서 username (또는 username이없는 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