Мне нужно узнать, сколько места на диске занимает каждый пользователь в сети. Я в курсе df
и du
команды: я мог бы перечислить всю файловую систему и AWK-вывод, но мне интересно, есть ли более стандартная команда.
Результат, который я ищу:
usr1 xMb
usr2 yMb
[...]
Total zMb
Любые идеи?
Спасибо!
PS. 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 крупнейших каталогов. Не совсем то, о чем вы просили, но я постоянно этим пользуюсь.
Во многих местах мы используем систему квот, но устанавливаем абсурдно высокие квоты. Таким образом, вы получаете возможность быстрой отчетности. На одном сайте каждому пользователю предоставляется 1 ТБ «квотного» пространства.
Мы периодически увеличиваем квоту по мере увеличения количества обслуживаемых дисков - изначально она составляла 30 ГБ на пользователя, что было абсурдно высоким в то время.
Нет такой команды. Для этого вам нужно написать несколько команд оболочки.
Мне кажется, что метод ThorstenS требует больше работы, потому что он выполняет поиск несколько раз. Для одного случая я бы просто выполнил одну команду поиска и вывел бы владельца и размер каждого файла, а затем проделал бы с этим файлом некую магию.
Поиск будет чем-то вроде того, который возвращает имя пользователя (или номер идентификатора без имени пользователя) и пространство, используемое в байтах, в файле с разделителями нуль-байтами:
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
Значительное увеличение скорости произойдет, если мы будем искать только 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