답변:
이 정보는 한 번입니까, 아니면 정기적으로 추출 할 수있는 정보입니까? 나중에 발생하는 경우 파일 시스템에 할당량을 적용하는 것이 하나의 옵션입니다. 시스템은 지속적으로 각 사용자가 사용하는 데이터의 양을 추적합니다. 그렇게하면 정보는 단순히 할당량 데이터베이스에 대한 쿼리 일뿐입니다.
내가 여기서 찾은 또 다른 좋은 해결책 . 이동 관심의 디렉토리 및 실행하려면 (또는 변경 .
중 디렉토리 이익에 당신이, 예를 들어 , /home/
) :
find . -type f -printf "%u %s\n" \
| awk '{user[$1]+=$2}; END{for(i in user) print i,user[i]}'
-printf "%u\t%s\n"
하고 awk -v OFS="\t"
당신이 생각하는 경우에 당신은 지금 그 공간을 가진 사용자 이름이있을 수 있습니다.
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