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

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

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

usr1  xMb
usr2  yMb
[...]
Total zMb

Любые идеи?

Спасибо!

PS. Red Hat Linux EE

8 голосов | спросил Escualo 15 TueEurope/Moscow2009-12-15T22:40:31+03:00Europe/Moscow12bEurope/MoscowTue, 15 Dec 2009 22:40:31 +0300 2009, 22:40:31

7 ответов


11

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

ответил andol 15 TueEurope/Moscow2009-12-15T22:47:23+03:00Europe/Moscow12bEurope/MoscowTue, 15 Dec 2009 22:47:23 +0300 2009, 22:47:23
3

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

find . -printf "%u  %s\n" | awk '{user[$1]+=$2}; END{ for( i in user) print i " " user[i]}'
ответил Jonas 28 PM00000050000005131 2011, 17:32:51
3

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

du -xk | sort -n | tail -25

и для Solaris:

du -dk | sort -n | tail -25   

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

ответил Ronald Pottol 16 WedEurope/Moscow2009-12-16T03:57:25+03:00Europe/Moscow12bEurope/MoscowWed, 16 Dec 2009 03:57:25 +0300 2009, 03:57:25
2

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

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

ответил David Mackintosh 15 TueEurope/Moscow2009-12-15T22:57:11+03:00Europe/Moscow12bEurope/MoscowTue, 15 Dec 2009 22:57:11 +0300 2009, 22:57:11
0

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

  1. получить всех пользователей из /etc /passwd с помощью uid> 1000
  2. использовать find -uid и искать все файлы пользователя
  3. используйте этот список для отправки du -s
ответил ThorstenS 15 TueEurope/Moscow2009-12-15T22:47:31+03:00Europe/Moscow12bEurope/MoscowTue, 15 Dec 2009 22:47:31 +0300 2009, 22:47:31
0

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

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

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

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

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

ответил Kyle Brandt 15 TueEurope/Moscow2009-12-15T22:55:49+03:00Europe/Moscow12bEurope/MoscowTue, 15 Dec 2009 22:55:49 +0300 2009, 22:55:49
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 18 FriEurope/Moscow2009-12-18T06:03:43+03:00Europe/Moscow12bEurope/MoscowFri, 18 Dec 2009 06:03:43 +0300 2009, 06:03:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132