home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume2 / newest / newest.c
Encoding:
C/C++ Source or Header  |  1991-08-07  |  5.0 KB  |  251 lines

  1. /*
  2.  *    newest:
  3.  *        Print file summary information.
  4.  *        Useful for cleaning up your disk space.
  5.  *
  6.  *    Donated to the public domain by Rick Richardson, 1988.
  7.  *    Use at your own risk. Quick & Dirty Coding Used Here.
  8.  *
  9.  *    Needs System V "ftw" routine or equivalent.
  10.  *    Needs System V "getopt" routine or equivalent.
  11.  *
  12.  *    No makefile needed, just type "make newest".
  13.  *
  14.  *    No man page needed, just type "newest" or "what newest".
  15.  *
  16.  *    Known to work on:
  17.  *        Venix SVR2.3    (80286)
  18.  *        UNIX SVR2    (VAX 785, 8700)
  19.  */
  20.  
  21. char    *Usage[] =
  22. {    /* Usage info, visible by 'what' */
  23. "@(#)    Usage:    newest [-st] directories ...",
  24. "@(#)    ",
  25. "@(#)        Print summary of access/modification/creation times",
  26. "@(#)        and/or file sizes of files found in directories",
  27. "@(#)    ",
  28. "@(#)        With no options, prints time information.",
  29. "@(#)        With -s, prints size information.",
  30. "@(#)        With -st, prints both type of information.",
  31. 0
  32. };
  33.  
  34. #include <stdio.h>
  35. #include <ftw.h>
  36. #include <sys/types.h>
  37. #include <sys/stat.h>
  38. #include <time.h>
  39.  
  40. int    unreadable;
  41. long    mtime;
  42. long    atime;
  43. long    Ctime;
  44. char    aname[BUFSIZ];
  45. char    mname[BUFSIZ];
  46. char    Cname[BUFSIZ];
  47. char    bigname[BUFSIZ];
  48. long    bigsize;
  49. int    files;
  50. long    bytes;
  51. int    bigflag;
  52. int    timeflag;
  53. #define    SECS    (60L*60L*24L)
  54. #define    EPOCH    9999999L
  55. long    dayvec[] =
  56. {
  57.     0, 1, 2, 3, 4, 5, 6, 7, 10, 20, 50, 100, 200, 500, EPOCH
  58. };
  59. #define    DAYSIZE    (sizeof(dayvec) / sizeof(dayvec[0]))
  60.  
  61. long    sizvec[] =
  62. {
  63.     0, 1000, 5000, 10000, 20000, 50000, 100000, 200000, 500000,
  64.     1000000, EPOCH
  65. };
  66. #define    SIZSIZE    (sizeof(sizvec) / sizeof(sizvec[0]))
  67.  
  68. int    afiles[DAYSIZE];
  69. int    mfiles[DAYSIZE];
  70. int    cfiles[DAYSIZE];
  71. int    sizfiles[SIZSIZE];
  72. long    now;
  73.  
  74. int
  75. in(mindays, maxdays, when)
  76. long    mindays, maxdays;
  77. long    when;
  78. {
  79.     long    minsecs = mindays * SECS;
  80.     long    maxsecs = maxdays * SECS;
  81.  
  82.     if ( (now-when)<maxsecs && (now-when)>=minsecs) return (1);
  83.     return (0);
  84. }
  85.  
  86. int
  87. siz(minsiz, maxsiz, thissiz)
  88. long    minsiz, maxsiz;
  89. long    thissiz;
  90. {
  91.     if ( thissiz<maxsiz && thissiz>=minsiz) return (1);
  92.     return (0);
  93. }
  94.  
  95. int
  96. fn(name, sp, what)
  97. char    *name;
  98. register struct stat    *sp;
  99. {
  100.     register int i;
  101.  
  102.     if (what != FTW_F && what != FTW_D)
  103.     {
  104.         ++unreadable;
  105.         return (0);
  106.     }
  107.     bytes += sp->st_size;
  108.     if (what != FTW_F) return(0);
  109.     ++files;
  110.     for (i = 1; i < DAYSIZE; ++i)
  111.     {
  112.         if (in(dayvec[i-1], dayvec[i], sp->st_mtime)) mfiles[i]++;
  113.         if (in(dayvec[i-1], dayvec[i], sp->st_atime)) afiles[i]++;
  114.         if (in(dayvec[i-1], dayvec[i], sp->st_ctime)) cfiles[i]++;
  115.     }
  116.     for (i = 1; i < SIZSIZE; ++i)
  117.         if (siz(sizvec[i-1], sizvec[i], sp->st_size)) sizfiles[i]++;
  118.     if (sp->st_mtime>mtime)
  119.         {mtime = sp->st_mtime; (void)strcpy(mname, name);}
  120.     if (sp->st_ctime>Ctime)
  121.         {Ctime = sp->st_ctime; (void)strcpy(Cname, name);}
  122.     if (sp->st_atime>atime)
  123.         {atime = sp->st_atime; (void)strcpy(aname, name);}
  124.     if (sp->st_size>bigsize)
  125.         {bigsize = sp->st_size; (void)strcpy(bigname, name);}
  126.     return (0);
  127. }
  128.  
  129. int
  130. main(argc, argv)
  131. int    argc;
  132. char    *argv[];
  133. {
  134.     char    *ctime();
  135.     long    time();
  136.     register int i, c, errflag = 0;
  137.     extern char    *optarg;
  138.     extern int    optind, opterr;
  139.  
  140.     while (( c = getopt(argc, argv, "st")) != EOF)
  141.         switch (c)
  142.         {
  143.         case 's':    bigflag = 1; break;
  144.         case 't':    timeflag = 1; break;
  145.         default:    errflag = 1; break;
  146.         }
  147.     if (optind == argc || errflag)
  148.     {
  149.         usage();
  150.         return (1);
  151.     }
  152.     now = time( (long *) 0);
  153.     for (i = optind; i < argc; ++i)
  154.     {
  155.         init();
  156.         walk(argv[i]);
  157.         stats(argv[i]);
  158.         graf(afiles, mfiles, cfiles);
  159.     }
  160.     return (0);
  161. }
  162.  
  163. init()
  164. {
  165.     register int    i;
  166.  
  167.     unreadable = 0;
  168.     mtime = 0;
  169.     atime = 0;
  170.     Ctime = 0;
  171.     bigsize = 0;
  172.     files = 0;
  173.     bytes = 0;
  174.     for (i = 1; i < DAYSIZE; ++i)
  175.     {
  176.         afiles[i] = 0;
  177.         mfiles[i] = 0;
  178.         cfiles[i] = 0;
  179.     }
  180.     for (i = 1; i < SIZSIZE; ++i)
  181.         sizfiles[i] = 0;
  182. }
  183.  
  184. walk(name)
  185. register char    *name;
  186. {
  187.     while (ftw(name, fn, 10) > 0)
  188.         ;
  189. }
  190.  
  191. stats(name)
  192. char    *name;
  193. {
  194.     (void)printf("\nDirectory:     %s\n", name);
  195.     (void)printf("Newest access: %s at %s", aname, ctime(&atime));
  196.     (void)printf("Newest modify: %s at %s", mname, ctime(&mtime));
  197.     (void)printf("Newest change: %s at %s", Cname, ctime(&Ctime));
  198.     (void)printf("Largest file:  %s is %ld bytes\n", bigname, bigsize);
  199.     if (unreadable)
  200.         (void) printf("Unreadable directories/files found\n");
  201. }
  202.  
  203. graf(avec, mvec, cvec)
  204. int    avec[];
  205. int    mvec[];
  206. int    cvec[];
  207. {
  208.     register int    i;
  209.  
  210.     if (!bigflag || timeflag)
  211.     {
  212.         for (i = 1; i < DAYSIZE; ++i)
  213.         {
  214.             if (dayvec[i] == EPOCH)
  215.                 (void) printf(
  216.         "%5ld - EPOCH days: %5d accessed %5d modified %5d changed\n",
  217.                     dayvec[i-1], avec[i], mvec[i], cvec[i]);
  218.             else
  219.                 (void) printf(
  220.         "%5ld - %5ld days: %5d accessed %5d modified %5d changed\n",
  221.                     dayvec[i-1], dayvec[i],
  222.                     avec[i], mvec[i], cvec[i] );
  223.         }
  224.         (void) printf(
  225.         "                    %5d TOTAL FILES, %7ld TOTAL BYTES\n\n",
  226.             files, bytes);
  227.     }
  228.  
  229.     if (bigflag)
  230.     {
  231.         for (i = 1; i < SIZSIZE; ++i)
  232.         {
  233.             if (sizvec[i] == EPOCH)
  234.                 (void)printf("%7ld -  ULIMIT bytes: %5d files\n",
  235.                     sizvec[i-1], sizfiles[i] );
  236.             else
  237.                 (void)printf("%7ld - %7ld bytes: %5d files\n",
  238.                     sizvec[i-1], sizvec[i], sizfiles[i] );
  239.         }
  240.         (void)printf("                    %7ld TOTAL BYTES\n", bytes);
  241.     }
  242. }
  243.  
  244. usage()
  245. {
  246.     register int    i;
  247.  
  248.     for (i = 0; Usage[i]; ++i)
  249.         (void)fprintf(stderr, "%s\n", &Usage[i][5]);
  250. }
  251.