Використання диска на користувача в Linux / Unix


10

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

Я шукаю результат:

usr1  xMb
usr2  yMb
[...]
Total zMb

Будь-які ідеї?

Дякую!

PS. Red Hat Linux EE

Відповіді:


11

Це разова річ, або це інформація, яку ви хочете регулярно отримувати? Якщо це пізніше, то одним із варіантів є застосування квот до вашої файлової системи. При цьому система постійно відстежує кількість даних, які використовує кожен користувач. Таким чином, інформація є лише запитом до бази даних квот.


1
Квота +1 - це рішення!
ThorstenS

Одноразова річ; можливо рішення, яке може бути збережене у невеликому сценарії для користувачів, щоб обчислити їх використання, якщо вони хочуть. Ми не можемо обмежувати кількість даних, оскільки тип роботи, яку ми виконуємо, не відповідає жорстким обмеженням.
Ескуало

@ThorstenS: Ми робимо технічні обчислення і нам потрібно генерувати тони інформації, яка може бути, а може і не бути видаленою після виконання запуску. Я не думаю, що квоти допомагають у нашій ситуації.
Ескуало

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]}'

1
+1. Можливо, додайте -тип f - це ви справді шукаєте лише файли?
Геннес

Хороша відповідь. Використання -printf "%u\t%s\n"і awk -v OFS="\t"якщо ви думаєте , що ви коли - небудь , можливо, ім'я користувача з простором в ньому.
TheDudeAbides

3

Або для пошуку проблемних користувачів (також і каталогів),

du -xk | sort -n | tail -25

і для Solaris:

du -dk | sort -n | tail -25   

Це дає вам список 25 найбільших каталогів. Не зовсім те, про що ви просили, але я цим постійно користуюся.


2

Ми багато в чому використовуємо систему квот, але встановлюємо абсурдно високі квоти. Таким чином ви отримуєте перевагу швидкої звітності. На одному сайті кожен користувач має 1 ТБ простору "квоти".

Ми періодично збільшуємо квоту вище, коли диски, що справляються, - спочатку це було 30 Гб на користувача, що на той час було абсурдно високим.


0

Такої команди немає. Для цього потрібно написати кілька команд оболонок.

  1. отримати всіх користувачів з / etc / passwd з uid> 1000
  2. використовувати find -uid та шукати всі файли користувача
  3. використовувати цей список для подачі du -s

Неефективна. Не потрібно запускати пошук кілька разів, якщо ви реєструєте інформацію в один і той же час. Збережіть цю інформацію під час першого запуску. Або у файлі, або в асоціативному масиві.
Геннес

0

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

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

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.