Мы должны хранить наши текущие проекты на довольно маленьком (~ 4 ТБ) сервере данных. Неудивительно, что он постоянно переполняется, и людям приходится удалять менее свежие файлы вручную.
Есть ли простой (также известный как стандартная командная строка) способ узнать, какие пользователи занимают больше всего места в каталоге? то есть суммирование размера всех файлов в каталоге и всех подкаталогах, принадлежащих каждому пользователю?
Редактировать: в идеале не использовать символические ссылки
В подобных ситуациях я обычно сначала использую 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 -«вычислить сумму списка чисел» взята из этого сообщения о переполнении стека . Обратите внимание на комментарии к ответу.
Чтобы найти использование диска всеми пользователями на диске, вы можете использовать следующий скрипт:
#! /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
напечатает размер каталога и всего его содержимого.
Чтобы действительно решить вашу проблему, вы можете использовать пользовательские (или групповые )квоты . Это позволит вам получить подробный отчет о том, сколько места занимает каждый пользователь/группа, и установить жесткие ограничения на то, сколько места они могут использовать.