В подобных ситуациях я обычно сначала использую du -kx | sort -rn | less
для перечисления каталогов в наибольшем -первом порядке. Это говорит мне, где находятся самые большие отдельные дисковые свиньи, поэтому я буду знать, где искать. Но, как сказал @SimonDoppler, если у вас нет хотя бы r-x
доступа ко всем подкаталогам -, ваш список будет неполным, :вы сможете получить только размеры каталогов, которые вы иметь доступ.
Помните, что :обычно вам нужно иметь доступ только для записи в каталог, чтобы удалить любые файлы в нем. Только если в каталоге установлен бит sticky
(, т. е. последняя буква в строке букв разрешения — t
вместо x
), вам нужно быть владельцем файла, чтобы удалить его.
Если нет доступной квоты, вам может потребоваться сделать что-то вроде этого:
#!/bin/sh
if [ "$1" = "" ] || [ "$1" = "-h" ]
then
echo "Usage: ${0##*/} " >&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 -«вычислить сумму списка чисел» взята из этого сообщения о переполнении стека . Обратите внимание на комментарии к ответу.
Если в вашей системе есть GNU xargs
, вы можете сделать что-то вроде
foo | xargs -d '\n' grep -l regex
Сbash
:
foo |
while IFS= read -r file; do
grep -qE "$regex" "$file" && printf '%s\n' "$file"
done
Если ваш grep
не понимает -q
, вы можете использовать
grep -E "$regex" "$file" >/dev/null 2>&1
вместо этого.