Вопрос или проблема
Мы должны хранить наши текущие проекты на довольно маленьком (~4TB) сервере данных. Неудивительно, что он постоянно переполнен, и людям приходится вручную перемещать менее свежие файлы.
Существует ли простой (т.е. стандартный командный) способ узнать, какие пользователи занимают больше всего места в директории? т.е. суммируя размер всех файлов в директории и всех поддиректориях, принадлежащих каждому пользователю?
Редактировать: идеальным вариантом было бы не следовать за символическими ссылками
Чтобы узнать использование диска всеми пользователями на диске, вы можете использовать следующий скрипт:
#! /bin/bash
DIRECTORY_TO_SCAN=/home
readarray -t user_list<<<"$(cat /etc/passwd | cut -d ':' -f 1)"
for u in "${user_list[@]}" ; do
printf "Сканирование для пользователя: %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
это выведет размер директории и всего её содержимого.
Чтобы фактически решить вашу проблему, вы можете использовать квоты для пользователей (или группы). Это позволит вам получить детализированный отчет о том, сколько места занимает каждый пользователь/группа, и установить жесткие ограничения на то, сколько места они могут использовать.
В таких ситуациях я обычно сначала использую du -kx | sort - rn | less
, чтобы перечислить директории в порядке убывания. Это говорит мне, где находятся самые большие потребители дискового пространства, и я буду знать, где искать. Но, как сказал @SimonDoppler, если у вас нет хотя бы r-x
доступа ко всем поддиректориям, ваш список будет неполным: вы сможете получить размеры только тех директорий, к которым у вас есть доступ.
Помните: обычно вам нужно иметь только право на запись в директорию, чтобы удалить любые файлы в ней. Только если в директории установлен бит sticky
(т.е. последняя буква в строке разрешений – t
, а не x
), вам нужно быть владельцем файла, чтобы удалить его.
Если квота недоступна, вам может потребоваться сделать что-то подобное:
#!/bin/sh
if [ "$1" = "" ] || [ "$1" = "-h" ]
then
echo "Использование: ${0##*/} <директория> <имя пользователя(ей)...>" >&2
exit 64 # EX_USAGE
fi
if ! [ -d "$1" ]
then
echo "ОШИБКА: директория $1 не существует" >&2
exit 66 # EX_NOINPUT
fi
REPORTROOT="$1"
shift
for U in "$@"
do
# Найдите все файлы под $REPORTROOT, принадлежащие определенному пользователю,
# получите их размеры и суммируйте их.
DISKUSE=$(find "$REPORTROOT" -type f -user "$U" \
-exec stat -c %s {} \+ 2>/dev/null \
| awk '{s+=$1} END {printf("%ld\n", s)}')
# Отобразите результат для этого пользователя.
printf "%16s: %d\n" "$U" "$DISKUSE"
done
Обратите внимание, что выполнение этого может занять некоторое время.
Строка awk для “подсчета суммы списка чисел” взята из этого сообщения Stack Overflow. Обратите внимание на комментарии к ответу.
Ответ или решение
Чтобы выяснить, какие пользователи занимают наибольшее количество дискового пространства на нашем сервере данных, можно использовать несколько подходов с командной строкой на Unix-подобных системах. Основной метод — воспользоваться командой find
в сочетании с du
и awk
, чтобы вычислить размер всех файлов, принадлежащих каждому пользователю в заданном каталоге.
Вот пример скрипта, который решает эту задачу:
#! /bin/bash
DIRECTORY_TO_SCAN=/home # Укажите каталог, который необходимо просканировать
# Читаем список пользователей из файла /etc/passwd
readarray -t user_list < <(cut -d ':' -f 1 /etc/passwd)
for u in "${user_list[@]}" ; do
# Суммируем размер файлов для каждого пользователя
DISKUSE=$(find "$DIRECTORY_TO_SCAN" -user "$u" -type f -exec stat -c %s {} + 2>/dev/null | awk '{s+=$1} END {printf("%ld\n", s)}')
if [ -n "$DISKUSE" ]; then
printf "%16s: %d байт\n" "$u" "$DISKUSE"
fi
done
Объяснение скрипта:
-
DIRECTORY_TO_SCAN: Установите переменную для каталога, который вы хотите просканировать (например,
/home
). -
Список пользователей: Мы извлекаем список пользователей из файла
/etc/passwd
, используя командуcut
, и сохраняем его в массивuser_list
. -
Цикл по пользователям: Для каждого пользователя мы используем команду
find
, чтобы отыскать все файлы, принадлежащие этому пользователю, и суммируем их размеры с помощьюstat
иawk
. Полученная сумма выводится в виде числа байт. -
Фильтрация: Если размер дискового пространства пользователя равен нулю (то есть нет файлов), вывод не отображается.
Важные заметки:
- Скрипт не следует за символическими ссылками (symlinks), так как мы используем только обычные файлы (
-type f
). - Убедитесь, что у вас есть необходимые разрешения для доступа к файлам в указанном каталоге.
- Для больших каталогов работа скрипта может занять продолжительное время.
Альтернативный подход:
Если ваш сервер поддерживает использование квот, рекомендуется настроить пользовательские или групповые квоты. Это позволит не только отслеживать, сколько пространства занимает каждый пользователь, но и устанавливать ограничения на использование дискового пространства. Инструкции по настройке квот можно найти в официальной документации для вашей операционной системы.
Дополнительный метод:
Вы также можете использовать команду du
, чтобы получить информацию о большом количестве данных:
du -sh /home/* | sort -hr | less
Эта команда обеспечит отображение размеров всех каталогов в /home
, упорядоченных по размеру.
Следуя указанным методам и скриптам, вы сможете эффективно определить пользователей, которые занимают наибольшее место на вашем сервере данных, и предпринять необходимые шаги для оптимизации использования дискового пространства.