Этот bash
шелл-скрипт использует
find
найти владельцев for
с командной строкой find
для поиска всех файлов, принадлежащих каждому владельцу du
du
результат подвергается пост--обработке, чтобы сделать его легко читаемым. Шелл-скрипт довольно быстр при тестировании на разделах с большим количеством файлов.
#!/bin/bash
# store owners in variable
user=$(whoami)
if [ "$user" != "root" ]
then
echo "Run with elevated permissions (as root or with sudo)"
exit
elif ! test -d "$1"
then
echo "Enter a target directory as parameter"
exit
fi
owners=$(find "$1" -printf "%u\n"|sort | uniq)
#echo "$owners"
leng=0
for i in $owners
do
if [ ${#i} -gt $leng ]
then
leng=${#i}
fi
done
#echo "$leng"
skip=$((leng - 4))
spc=$(for ((i=0;i<skip;i++)); do printf " "; done)
printf "User $spc Size\n---- $spc ----\n"
for i in $owners
do
skip=$((leng - ${#i}))
spc=$(for ((i=0;i<skip;i++)); do printf " "; done)
printf "$i $spc "
find "$1" -type f -user "$i" -print0 | du --files0-from=- --total -sh |
tail -n1 | cut -f 1
done
Принятие имениdisk-usage-by-owner
ubuntu@ubuntu:~$./disk-usage-by-owner
Run with elevated permissions (as root or with sudo)
ubuntu@ubuntu:~$ sudo./disk-usage-by-owner
Enter a target directory as parameter
Диалог в постоянном живом диске
ubuntu@ubuntu:~/bin$ sudo./disk-usage-by-owner /cdrom
User Size
---- ----
root 1.9G
ubuntu@ubuntu:~/bin$ sudo./disk-usage-by-owner /home
User Size
---- ----
root 0
ubuntu 1.9G
ubuntu@ubuntu:~/bin$ sudo./disk-usage-by-owner /media/ubuntu/casper-rw
User Size
---- ----
_apt 0
colord 44K
gdm 288K
man 628K
root 1007M
syslog 127M
systemd-timesync 0
ubuntu 1.9G
Жесткие ссылки учитываются только один раз
$ sudo find. -user root -ls
56492055 1024 -rw-r--r-- 3 root root 1048576 jan 16 23:41./owned\ by\ root\ hard-linked
56492055 1024 -rw-r--r-- 3 root root 1048576 jan 16 23:41./owned\ by\ root
56492055 1024 -rw-r--r-- 3 root root 1048576 jan 16 23:41./sub/owned\ by\ root
$ sudo./disk-usage-by-owner.
User Size
---- ----
root 1,0M
sudodus 32K
$ du.
4 ./sub
1064 .