home *** CD-ROM | disk | FTP | other *** search
- /*
- * 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]);
- }
-