Использование диска на пользователя в 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
с чем-то, с чем может быть немного легче работать, например с вкладками или новыми строками, но это будет менее безопасно, если у вас есть прикольные имена файлов.
Если вы хотите быть еще более эффективным, вы можете перенаправить вывод в скрипт, который обрабатывает его во время работы, но это будет немного больше работы, и вам придется сделать это правильно с первого раза.
Нет такой команды. Вы должны написать некоторые команды оболочки для этого.
- получить всех пользователей из /etc/passwd с uid >1000
- используйте find -uid и ищите все файлы пользователя
- используйте этот список, чтобы накормить du -s