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

10

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

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

usr1  xMb
usr2  yMb
[...]
Total zMb

Есть идеи?

Спасибо!

PS. Red Hat Linux EE

Escualo
источник

Ответы:

11

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

andol
источник
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]}'
Jonas
источник
1
+1. Может быть, добавьте -type f, если вы действительно ищете только файлы?
Хенн
Хороший ответ. Используйте, -printf "%u\t%s\n"и awk -v OFS="\t"если вы думаете, что у вас когда-либо может быть имя пользователя с пробелом в нем.
TheDudeAbides
3

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

du -xk | sort -n | tail -25

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

du -dk | sort -n | tail -25   

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

Рональд Поттол
источник
2

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

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

Дэвид Макинтош
источник
0

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

  1. получить всех пользователей из / etc / passwd с uid> 1000
  2. используйте find -uid и ищите все файлы пользователя
  3. используйте этот список, чтобы накормить du-s
ThorstenS
источник
Неэффективное. Вам не нужно запускать find несколько раз, если вы одновременно регистрируете информацию. Сохраните эту информацию во время первого запуска. Либо в файле, либо в ассоциативном массиве.
Хеннес
0

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

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

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

Большое увеличение скорости произойдет, если мы будем искать только 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
kolypto
источник