v02i027: newest - print file system summary
Rick Richardson
rick at pcrat.UUCP
Sun Jan 31 07:26:36 AEST 1988
Comp.sources.misc: Volume 2, Issue 27
Submitted-By: Rick Richardson <rick at pcrat.UUCP>
Archive-Name: newest
Comp.sources.misc: Volume 2, Issue 27
Submitted-By: Rick Richardson <rick at pcrat.UUCP>
Archive-Name: newest
We use this around here when cleaning up our disks. Maybe
others could use it, too.
-Rick Richardson
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# newest.c
# This archive created: Wed Jan 27 11:15:28 1988
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'newest.c'
then
echo shar: "will not over-write existing file 'newest.c'"
else
cat << \SHAR_EOF > 'newest.c'
/*
* newest:
* Print file summary information.
* Useful for cleaning up your disk space.
*
* Donated to the public domain by Rick Richardson, 1988.
* Use at your own risk. Quick & Dirty Coding Used Here.
*
* Needs System V "ftw" routine or equivalent.
* Needs System V "getopt" routine or equivalent.
*
* No makefile needed, just type "make newest".
*
* No man page needed, just type "newest" or "what newest".
*
* Known to work on:
* Venix SVR2.3 (80286)
* UNIX SVR2 (VAX 785, 8700)
*/
char *Usage[] =
{ /* Usage info, visible by 'what' */
"@(#) Usage: newest [-st] directories ...",
"@(#) ",
"@(#) Print summary of access/modification/creation times",
"@(#) and/or file sizes of files found in directories",
"@(#) ",
"@(#) With no options, prints time information.",
"@(#) With -s, prints size information.",
"@(#) With -st, prints both type of information.",
0
};
#include <stdio.h>
#include <ftw.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
int unreadable;
long mtime;
long atime;
long Ctime;
char aname[BUFSIZ];
char mname[BUFSIZ];
char Cname[BUFSIZ];
char bigname[BUFSIZ];
long bigsize;
int files;
long bytes;
int bigflag;
int timeflag;
#define SECS (60L*60L*24L)
#define EPOCH 9999999L
long dayvec[] =
{
0, 1, 2, 3, 4, 5, 6, 7, 10, 20, 50, 100, 200, 500, EPOCH
};
#define DAYSIZE (sizeof(dayvec) / sizeof(dayvec[0]))
long sizvec[] =
{
0, 1000, 5000, 10000, 20000, 50000, 100000, 200000, 500000,
1000000, EPOCH
};
#define SIZSIZE (sizeof(sizvec) / sizeof(sizvec[0]))
int afiles[DAYSIZE];
int mfiles[DAYSIZE];
int cfiles[DAYSIZE];
int sizfiles[SIZSIZE];
long now;
int
in(mindays, maxdays, when)
long mindays, maxdays;
long when;
{
long minsecs = mindays * SECS;
long maxsecs = maxdays * SECS;
if ( (now-when)<maxsecs && (now-when)>=minsecs) return (1);
return (0);
}
int
siz(minsiz, maxsiz, thissiz)
long minsiz, maxsiz;
long thissiz;
{
if ( thissiz<maxsiz && thissiz>=minsiz) return (1);
return (0);
}
int
fn(name, sp, what)
char *name;
register struct stat *sp;
{
register int i;
if (what != FTW_F && what != FTW_D)
{
++unreadable;
return (0);
}
bytes += sp->st_size;
if (what != FTW_F) return(0);
++files;
for (i = 1; i < DAYSIZE; ++i)
{
if (in(dayvec[i-1], dayvec[i], sp->st_mtime)) mfiles[i]++;
if (in(dayvec[i-1], dayvec[i], sp->st_atime)) afiles[i]++;
if (in(dayvec[i-1], dayvec[i], sp->st_ctime)) cfiles[i]++;
}
for (i = 1; i < SIZSIZE; ++i)
if (siz(sizvec[i-1], sizvec[i], sp->st_size)) sizfiles[i]++;
if (sp->st_mtime>mtime)
{mtime = sp->st_mtime; (void)strcpy(mname, name);}
if (sp->st_ctime>Ctime)
{Ctime = sp->st_ctime; (void)strcpy(Cname, name);}
if (sp->st_atime>atime)
{atime = sp->st_atime; (void)strcpy(aname, name);}
if (sp->st_size>bigsize)
{bigsize = sp->st_size; (void)strcpy(bigname, name);}
return (0);
}
int
main(argc, argv)
int argc;
char *argv[];
{
char *ctime();
long time();
register int i, c, errflag = 0;
extern char *optarg;
extern int optind, opterr;
while (( c = getopt(argc, argv, "st")) != EOF)
switch (c)
{
case 's': bigflag = 1; break;
case 't': timeflag = 1; break;
default: errflag = 1; break;
}
if (optind == argc || errflag)
{
usage();
return (1);
}
now = time( (long *) 0);
for (i = optind; i < argc; ++i)
{
init();
walk(argv[i]);
stats(argv[i]);
graf(afiles, mfiles, cfiles);
}
return (0);
}
init()
{
register int i;
unreadable = 0;
mtime = 0;
atime = 0;
Ctime = 0;
bigsize = 0;
files = 0;
bytes = 0;
for (i = 1; i < DAYSIZE; ++i)
{
afiles[i] = 0;
mfiles[i] = 0;
cfiles[i] = 0;
}
for (i = 1; i < SIZSIZE; ++i)
sizfiles[i] = 0;
}
walk(name)
register char *name;
{
while (ftw(name, fn, 10) > 0)
;
}
stats(name)
char *name;
{
(void)printf("\nDirectory: %s\n", name);
(void)printf("Newest access: %s at %s", aname, ctime(&atime));
(void)printf("Newest modify: %s at %s", mname, ctime(&mtime));
(void)printf("Newest change: %s at %s", Cname, ctime(&Ctime));
(void)printf("Largest file: %s is %ld bytes\n", bigname, bigsize);
if (unreadable)
(void) printf("Unreadable directories/files found\n");
}
graf(avec, mvec, cvec)
int avec[];
int mvec[];
int cvec[];
{
register int i;
if (!bigflag || timeflag)
{
for (i = 1; i < DAYSIZE; ++i)
{
if (dayvec[i] == EPOCH)
(void) printf(
"%5ld - EPOCH days: %5d accessed %5d modified %5d changed\n",
dayvec[i-1], avec[i], mvec[i], cvec[i]);
else
(void) printf(
"%5ld - %5ld days: %5d accessed %5d modified %5d changed\n",
dayvec[i-1], dayvec[i],
avec[i], mvec[i], cvec[i] );
}
(void) printf(
" %5d TOTAL FILES, %7ld TOTAL BYTES\n\n",
files, bytes);
}
if (bigflag)
{
for (i = 1; i < SIZSIZE; ++i)
{
if (sizvec[i] == EPOCH)
(void)printf("%7ld - ULIMIT bytes: %5d files\n",
sizvec[i-1], sizfiles[i] );
else
(void)printf("%7ld - %7ld bytes: %5d files\n",
sizvec[i-1], sizvec[i], sizfiles[i] );
}
(void)printf(" %7ld TOTAL BYTES\n", bytes);
}
}
usage()
{
register int i;
for (i = 0; Usage[i]; ++i)
(void)fprintf(stderr, "%s\n", &Usage[i][5]);
}
SHAR_EOF
fi
exit 0
# End of shell archive
More information about the Comp.sources.misc
mailing list