Linux / Unix에서 사용자 당 디스크 사용량


10

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

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

usr1  xMb
usr2  yMb
[...]
Total zMb

어떤 아이디어?

감사!

추신. Red Hat Linux EE

답변:


11

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


1
+1 할당량이 솔루션입니다!
ThorstenS

일회성; 사용자가 원하는 경우 사용량을 계산할 수 있도록 작은 스크립트에 저장할 수있는 솔루션 일 수 있습니다. 우리는 하드 제한을 수용하지 않는 작업 유형으로 인해 데이터 양을 제한 할 수 없습니다.
Escualo

@ThorstenS : 기술 컴퓨팅을 수행하며 실행 후 제거되거나 제거되지 않을 수있는 수많은 정보를 생성해야합니다. 할당량은 우리 상황에 도움이되지 않는다고 생각합니다.
Escualo

1
@Arrieta : 사용을 제한 할 필요는 없습니다. 각 사용자에게 엄청나게 높은 할당량을 부여하십시오. 또한 모든 사용자는 스스로 할당량 데이터베이스를 쿼리하여 현재 저장하고있는 데이터의 양을 확인할 수 있습니다.
andol

2
할당량을 큰 숫자로 설정할 필요조차 없습니다. 할당량을 설정하지 않은 경우 (예 : 0) 할당량을 적용하지 않지만 사용량을 기록합니다.
Daniel

4

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

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

1
+1. 아마 -type f를 추가하면 실제로 파일만을 찾고 있습니까?
Hennes

좋은 대답입니다. 사용 -printf "%u\t%s\n"하고 awk -v OFS="\t"당신이 생각하는 경우에 당신은 지금 그 공간을 가진 사용자 이름이있을 수 있습니다.
TheDudeAbides

3

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

du -xk | sort -n | tail -25

그리고 Solaris의 경우 :

du -dk | sort -n | tail -25   

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


2

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

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


0

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

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

무능한. 정보를 동시에 기록하는 경우 찾기를 여러 번 실행할 필요가 없습니다. 처음 실행하는 동안 해당 정보를 저장하십시오. 파일 또는 연관 배열 중 하나입니다.
Hennes

0

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

find는 null 바이트로 구분 된 파일에서 username (또는 username이없는 id 번호)과 바이트 단위로 사용 된 공간을 반환하는 것과 같습니다.

sudo bash -c 'find . -printf "%u\0%s\0" > username_usage'

\0탭이나 줄 바꿈과 같이 작업하기가 조금 더 쉬운 것으로 바꿀 수 있지만 파일 이름이 펑키하면 덜 안전합니다.

더 효율적으로 작업하려면 출력을 처리하는 스크립트로 출력을 파이프 할 수 있지만 약간 더 많은 작업이 필요하므로 처음에 올바르게 가져와야합니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.