English

Accueil > Annuaire > Pages web du personnel > Jérôme LE TANOU > Script DiskUsage.sh



Rechercher

OSUG - Terre Univers Environnement

Script DiskUsage.sh

20 avril 2014

Ce script permet de déterminer la volumétrie et le nombre de fichiers de chaque utilisateur et groupe pour le répertoire passé en paramètre.


Exemple : UsageDisk.sh /data/cycle

Disk Usage at 2014/04/13-22:32

Per Login       Disk Usage      Number of files
-----------------------------------------------
olduser          700.11 Go      1107083
pontonf          655.53 Go      15012649
walpersa         648.92 Go      4280701
cotten           246.58 Go      313486
bonifack         191.28 Go      42486
mousavza          87.10 Go      43334
pathiere          73.45 Go      4542
cottonfa          68.22 Go      467704
quirozw           39.04 Go      80285
voisinc           33.76 Go      24549
lasserec          29.26 Go      5177
daouts            12.40 Go      2554
fruneaub           7.72 Go      3794
roussbap           5.46 Go      4865
reversot           4.30 Go      2564
chiancoa           3.06 Go      12
colonc           451.85 Mo      46
benjelya         300.93 Mo      102
socqueta          84.76 Mo      129
pinelv            34.12 Mo      115
desigoyj           1.09 Mo      1
root                852 Ko      8
-----------------------------------------------

Per Group       Disk Usage      Number of files
-----------------------------------------------
cycle              2.81 To      21396186
-----------------------------------------------

-----------------------------------------------
Total disk usage : 2.81 To
Total number of files : 21396186
-----------------------------------------------

Code ( shell et awk) :

#!/bin/bash
#
# File : DiskUsage.sh
#
#########################################################################
# Copyright (C) 2014 - Jerome Le Tanou <jerome.le-tanou@laposte.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#########################################################################

find $1  -type f -printf '%u %g %k\n' | awk -v date=$(date +%Y/%m/%d-%H:%M) ' {
       user_usage[$1] += $3
       group_usage[$2] += $3
       user_files[$1] += 1
       group_files[$2] += 1
       total_usage += $3
       total_files += 1
       nb_users += 1
       nb_groups += 1
}

END {

       indice = 1
       for (user in user_usage)
       # Save the user's usage in an indice array.
       {
               # Save the user name
               users[indice] = user
               # Save the user usage
               usage[indice] = user_usage[user]
               indice++
       }
       do
       # Reverse sort by user usage
       # bubble sort
       {
               last = indice - 1
               changed = 0
               for (i=1; i < last; i++)
               {
                       if (usage[i] < usage[i+1])
                       {
                               temp = usage[i+1]
                               usage[i+1] = usage[i]
                               usage[i] = temp
                               temp = users[i+1]
                               users[i+1] = users[i]
                               users[i] = temp
                               changed++
                       }
               }
       } while (changed != 0)


       printf "Disk Usage at %s\n",date
       print "\nPer Login   \tDisk Usage\tNumber of files"
       print "-----------------------------------------------"
       for (i=1; i < indice; i++)
       {
               # To
               if ( usage[i] >= 1000000000 ) printf "%-8s\t '%6.2f' To\t%-d\n",users[i],usage[i]/1000000000,user_files[users[i]];
               # Go
               else if ( usage[i] >= 1000000 ) printf "%-8s\t '%6.2f' Go\t%-d\n",users[i],usage[i]/1000000,user_files[users[i]];
               # Mo
               else if ( usage[i] >= 1000) printf "%-8s\t '%6.2f' Mo\t%-d\n",users[i],usage[i]/1000,user_files[users[i]];
               # Ko
               else  printf "%-8s\t %6d Ko\t%-d\n",users[i],usage[i],user_files[users[i]];
       }

       indice = 1
       for (group in group_usage)
       # Save the group's usage in indice array.
       {
               # Save the group name
               groups[indice] = group
               # Save the group usage
               usage[indice] = group_usage[group]
               indice++
       }
       do
       # Reverse sort by group usage
       # bubble sort
       {
               last = indice -1
               changed = 0
               for (i=1; i < last ; i++)
               {
                       if (usage[i] < usage[i+1])
                       {
                               temp = usage[i+1]
                               usage[i+1] = usage[i]
                               usage[i] = temp
                               temp = groups[i+1]
                               groups[i+1] = groups[i]
                               groups[i] = temp
                               changed++
                       }
               }
       } while (changed != 0)


       print "-----------------------------------------------"
       print "\nPer Group   \tDisk Usage\tNumber of files"
       print "-----------------------------------------------"

       for (i=1; i < indice; i++)
       {
               # To
               if ( usage[i] >= 1000000000 ) printf "%-8s\t '%6.2f' To\t%-d\n",groups[i],usage[i]/1000000000,group_files[groups[i]];
               # Go
               else if ( usage[i] >= 1000000 ) printf "%-8s\t '%6.2f' Go\t%-d\n",groups[i],usage[i]/1000000,group_files[groups[i]];
               # Mo
               else if ( usage[i] >= 1000) printf "%-8s\t '%6.2f' Mo\t%-d\n",groups[i],usage[i]/1000,group_files[groups[i]];
               # Ko
               else  printf "%-8s\t %6d Ko\t%-d\n",groups[i],usage[i],groups_files[groups[i]];
       }
       print "-----------------------------------------------"
       print "\n-----------------------------------------------"
       # To
       if ( total_usage >= 1000000000 ) printf "Total disk usage : %4.2f To\n",total_usage/1000000000;
       # Go
       else if ( total_usage >= 1000000 ) printf "Total disk usage : %4.2f Go\n",total_usage/1000000;
       # Mo
       else if ( total_usage >= 1000) printf "Total disk usage : %4.2f Mo\n",total_usage/1000;
       # Ko
       else  printf "Total disk usage : %4.2f Ko\n",total_usage;
       # Number of file
       printf "Total number of files : %d\n",total_files
       print "-----------------------------------------------"
} '




Sous la tutelle de :

JPEG JPEGJPEG JPEGJPEG



Crédits et mentions légales | Contact | Plan du site | @2019 OSUG