Выясните, какие пользователи занимают больше всего дискового пространства на нашем сервере данных.

Мы должны хранить наши текущие проекты на довольно маленьком (~ 4 ТБ) сервере данных. Неудивительно, что он постоянно переполняется, и людям приходится удалять менее свежие файлы вручную.
Есть ли простой (также известный как стандартная командная строка) способ узнать, какие пользователи занимают больше всего места в каталоге? то есть суммирование размера всех файлов в каталоге и всех подкаталогах, принадлежащих каждому пользователю?

Редактировать: в идеале не использовать символические ссылки

0
26.03.2019, 09:51
2 ответа

В подобных ситуациях я обычно сначала использую du -kx | sort -rn | lessдля перечисления каталогов в наибольшем -первом порядке. Это говорит мне, где находятся самые большие отдельные дисковые свиньи, поэтому я буду знать, где искать. Но, как сказал @SimonDoppler, если у вас нет хотя бы r-xдоступа ко всем подкаталогам -, ваш список будет неполным, :вы сможете получить только размеры каталогов, которые вы иметь доступ.

Помните, что :обычно вам нужно иметь доступ только для записи в каталог, чтобы удалить любые файлы в нем. Только если в каталоге установлен бит sticky(, т. е. последняя буква в строке букв разрешения — tвместо x), вам нужно быть владельцем файла, чтобы удалить его.

Если нет доступной квоты, вам может потребоваться сделать что-то вроде этого:

#!/bin/sh
if [ "$1" = "" ] || [ "$1" = "-h" ]
then
    echo "Usage: ${0##*/} <directory> <username(s)...>" >&2
    exit 64 # EX_USAGE
fi
if ! [ -d "$1" ]
then
    echo "ERROR: directory $1 does not exist" >&2
    exit 66 # EX_NOINPUT
fi

REPORTROOT="$1"
shift
for U in "$@"
do
    # Find all files under $REPORTROOT owned by a particular user,
    # get their sizes and sum them together.
    DISKUSE=$(find "$REPORTROOT" -type f -user "$U" \
        -exec stat -c %s {} \+ 2>/dev/null \
        | awk '{s+=$1} END {printf("%ld\n", s)}')
    # Display the result for this user.
    printf "%16s: %d\n" "$U" "$DISKUSE"
done

Обратите внимание, что это может занять некоторое время.

Строка awk one -«вычислить сумму списка чисел» взята из этого сообщения о переполнении стека . Обратите внимание на комментарии к ответу.

0
28.01.2020, 03:53

Чтобы найти использование диска всеми пользователями на диске, вы можете использовать следующий скрипт:

#! /bin/bash

DIRECTORY_TO_SCAN=/home

readarray -t user_list<<<"$(cat /etc/passwd | cut -d ':' -f 1)"

for u in "${user_list[@]}" ; do
        printf "Scanning for user: %30s" "$u"
        du -ch $(find "$DIRECTORY_TO_SCAN" -user "$u" 2>/dev/null) 2>/dev/null | sed -e '/total/!d;s/^/    /'
done

Этот сценарий будет сканировать список всех пользователей, находить файлы, которые вы можете читать и которые принадлежат им, и вычислять общее пространство, занимаемое этими файлами.


(Часть ниже сохранена для полноты картины)

Если вы хотите узнать полный размер каталога, вы можете использовать команду du:

du -sh directory1 directory2

напечатает размер каталога и всего его содержимого.

Чтобы действительно решить вашу проблему, вы можете использовать пользовательские (или групповые )квоты . Это позволит вам получить подробный отчет о том, сколько места занимает каждый пользователь/группа, и установить жесткие ограничения на то, сколько места они могут использовать.

0
28.01.2020, 03:53

Теги

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