[comp.sys.apollo] joindu - Joint disk usage of similar directories

GELINASJ@CMR001.BITNET (12/30/89)

 This csh script can be used to list side by side the files of similar
directories -perhaps on different apollo nodes- and the disk space used.
      It is slow and, hum..., not elegant, but helps me to keep in sync
the  /usr/local/bin  directories on our 3 DN4000 cluster.

      If you want to speed it up or translate it to sh or FORTRAN, please
feel free to do so. And a happy new year to all.

------------------------cut here---------------------------------
#!/bin/csh
#               joindu   [directory list]
#
#       Creates a joint listing of disk space used in directories
#       For example,
#               % joindu //node_[1-3]/usr/local/bin
#       will produce on standard output a 3 column listing
#       of <du -s> of each directory with a TOTAL line.
#               <gelinasj@cmr001.bitnet>
onintr cleanup
# Header line with date and time
if (! $#argv)  set  argv=(".")
set date=`date`
echo  "         JOINT DISK USAGE on $date[1], $date[3] $date[2] \
                  $date[6], at $date[4]"  >! /tmp/joindu$$.dirs
# Reverse the arguments and make a list of directory names
set dirs=
foreach d ($*)
    set dirs=($d $dirs)
    echo  \#${#dirs}: $d        >>/tmp/joindu$$.dirs
end
# Make a sorted, unique list of all files names with 0 blocks
apply ls $*                                             |       \
sort  -u                                                |       \
awk   '{print $1,0}' -  > /tmp/joindu$$.miss
# Initialise the database with a dummy void directory
cp    /tmp/joindu$$.miss  /tmp/joindu$$.all
# Join on the file names (first field)
foreach d ($dirs)
        (cd $d; /bin/du -s *)                           |       \
        awk '{print $2,$1}' -                           |       \
        sort -m +0 -1 +1 -2 -dr - /tmp/joindu$$.miss    |       \
        sort -um +0 -1 -                                |       \
        join - /tmp/joindu$$.all  > /tmp/joindu$$.t
        mv /tmp/joindu$$.t   /tmp/joindu$$.all
end
# align the output, sum the block counts (skip the last column)
awk     'NR == 1  {     nf=NF                                   \
                        printf  "\n%15s" , " "                  \
                        for( i = 1 ; i < nf-1 ; i++ )           \
                                printf  "     #%2d" , i         \
                  }                                             \
                  {     printf  "\n%15s" , substr( $1, 0, 15 )  \
                        for( i = 2 ; i < nf ; i++ )             \
                        {                                       \
                                printf  "%8d" , $i              \
                                s[i] += $i                      \
                        }                                       \
                  }                                             \
        END       {     printf  "\n\n%15s" , "TOTAL"            \
                        for( i = 2 ; i < nf ; i++ )             \
                        {                                       \
                                printf  "%8d" , s[i]            \
                        }                                       \
                        printf  "\n"                            \
                  }'    /tmp/joindu$$.all               |       \
cat  /tmp/joindu$$.dirs  -
# Clean up /tmp
cleanup:
rm -f /tmp/joindu$$.{all,dirs,miss,t}
------------------------cut here---------------------------------

J. GELINAS       (gelinasj@cmr001.bitnet)