Использование диска на пользователя в Linux / Unix

Мне нужно выяснить, сколько дискового пространства занимает каждый пользователь в сети. Я в курсе df а также du Команды: я мог бы перечислить всю файловую систему и AWK вывод, но мне интересно, есть ли более стандартная команда.

Результат, который я ищу:

usr1  xMb
usr2  yMb
[...]
Total zMb

Есть идеи?

Спасибо!

PS. Red Hat Linux EE

8 ответов

Это единоразово или эту информацию вы хотите регулярно извлекать? В случае, если это позднее, тогда один вариант - применить квоты в вашей файловой системе. При этом система постоянно отслеживает объем данных, используемых каждым пользователем. Таким образом, информация - это просто запрос к базе данных квот.

Вот простое и быстрое решение, которое, я считаю, соответствует вашим требованиям.

Я предполагаю, что у всех ваших пользователей есть учетные записи в каталоге /home. Все, что вам нужно сделать, это сменить каталог на каталог /home, а затем выполнить du на глубине 1.

      cd /home
sudo du -d 1 -h

Ваш вывод будет выглядеть примерно так:

      kcyow@linux-server:/home$ sudo du -d 1 -h
7.8M    ./user932
52G     ./user575
20K     ./user329
98G     ./user323
48G     ./user210
148G    ./user44
12M     ./kcyow
362G    ./user28
24G     ./user774
6.2M    ./user143
730G    .

Еще одно приятное решение, которое я нашел здесь. Перейдите к интересующему каталогу и запустите (альтернативно, измените . в любой каталог, который вас интересует, например /home/):

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

Или для поиска проблемных пользователей (каталоги тоже),

du -xk | sort -n | tail -25

и для соляриса:

du -dk | sort -n | tail -25   

Это дает вам список из 25 крупнейших каталогов. Не совсем то, что вы просили, но я использую это все время.

Во многих местах мы используем систему квот, но устанавливаем нелепо высокие квоты. Таким образом, вы получаете преимущество быстрой отчетности. На одном сайте у каждого пользователя есть 1 ТБ пространства "квоты".

Мы периодически увеличиваем квоту по мере роста исправного диска - изначально он составлял 30 ГБ на пользователя, что было абсурдно высоким в то время.

Я сделал это:) Не быстро, но работает:

#!/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

Значительное увеличение скорости произойдет, если мы будем искать только UID>1000:

- 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

Метод ThorstenS, кажется, требует больше работы, чем нужно, потому что он запускает поиск несколько раз. Для начала я бы просто выполнил команду 1 find и вывел владельца и размер каждого файла, а затем применил магию сортировки к этому файлу.

Поиск будет что-то вроде того, что возвращает имя пользователя (или номер идентификатора без имени пользователя) и пространство, используемое в байтах, в файле с разделителями из нулевого байта:

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

Вы можете заменить \0 с чем-то, с чем может быть немного легче работать, например с вкладками или новыми строками, но это будет менее безопасно, если у вас есть прикольные имена файлов.

Если вы хотите быть еще более эффективным, вы можете перенаправить вывод в скрипт, который обрабатывает его во время работы, но это будет немного больше работы, и вам придется сделать это правильно с первого раза.

Нет такой команды. Вы должны написать некоторые команды оболочки для этого.

  1. получить всех пользователей из /etc/passwd с uid >1000
  2. используйте find -uid и ищите все файлы пользователя
  3. используйте этот список, чтобы накормить du -s
Другие вопросы по тегам