[comp.unix.questions] Summary of "listing files bet 2 dates"

manoj@hpldsla.sid.hp.com (Manoj Joshi) (10/26/90)

I got a lot of interesting mail from people on the net which was 
very helpful. To summarise, the general opinion was that `find` was the
closest way to solve this problem. I found that somehow the mtime
and ctime options of find are not to accurate. Besides, I found that
I had to write a shell script anyway which feeds the dates to 
find. So I decided instead to write a shell script which scans through the
files in a dir, and uses a c program to check if the file matches the
time interval condition. The performance was great, it's lightning 
fast on my 12 mip w/s. Anyway, I have included these here for people's 
curiosity. I can make the script and the program more efficient
but here it is only on an experimental basis. (For instance, I think 
the comparison loop should exit as soon as the first mismatch is found
since, the -t option of ls ensures the files are scanned in the 
chronological order.)

With this script I could archive files between two dates. And it is 
accurate about that. It will not be too hard to implement exact times. 
In the long run, I would probably put the whole stuff including listing
the files in the same program.


/*********************************************************************/
/*  EXAMPLE LISTING */
/*********************************************************************/

#!/bin/ksh
# Declaration of variables

hostName=$1
instName=$2
fromDate=$3
toDate=$4
selectList=""
searchDir=$DATA_DIR/$hostName/hpchem/$instName/data
currentDir=`pwd`
cd $searchDir

list=`ls -Rrt`
for currentFile in $list
do
   $currentDir/selectFile $searchDir/$currentFile $fromDate $toDate
   result=$?
   if [ result -eq 0 ]
   then
      selectList="$selectList $currentFile"
   fi
done
echo tar -cvf /dev/update.src $selectList
cd $currentDir


/*********************************************************************/
/*  EXAMPLE LISTING */
/*********************************************************************/


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>

int selectFile(file, fromDate, toDate)
   char* file; 
   char* fromDate; 
   char* toDate;
   { /* selectFile */
   struct stat *buf;
   struct tm *timeptr1;
   struct tm *timeptr2;
   time_t ftime;
   time_t ttime;

   int fDate = (int)atoi(fromDate);
   int tDate = (int)atoi(toDate);

   buf = (struct stat *)malloc(sizeof(struct stat));
   memset(buf, '\0', sizeof(struct stat));

   if (stat(file, buf))
      {
      perror("stat");
      return(1);
      };

   timeptr1 = (struct tm *)malloc(sizeof(struct tm));
   memset(timeptr1, '\0', sizeof(struct tm));
   timeptr1->tm_sec = 0;
   timeptr1->tm_min = 0;
   timeptr1->tm_hour = 0;
   timeptr1->tm_mday = fDate%100;
   timeptr1->tm_mon = (fDate/100)%100-1;
   timeptr1->tm_year = (fDate/10000)%100;
   timeptr1->tm_wday = 0;
   timeptr1->tm_yday = 0;
   timeptr1->tm_isdst = -1;
    
   timeptr2 = (struct tm *)malloc(sizeof(struct tm));
   memset(timeptr2, '\0', sizeof(struct tm));
   timeptr2->tm_sec = 59;
   timeptr2->tm_min = 59;
   timeptr2->tm_hour = 23;
   timeptr2->tm_mday = tDate%100;
   timeptr2->tm_mon = (tDate/100)%100-1;
   timeptr2->tm_year = (tDate/10000)%100;
   timeptr2->tm_wday = 0;
   timeptr2->tm_yday = 0;
   timeptr2->tm_isdst = -1;

   if ((ftime = mktime(timeptr1)) == (time_t)-1)
      {
      perror("mktime");
      return(1);
      };

   if ((ttime = mktime(timeptr2)) == (time_t)-1)
      {
      perror("mktime");
      return(1);
      };

#ifdef TEST
   printf("From Date : %s\n", asctime(timeptr1));
   printf("To Date : %s\n", asctime(timeptr2));
   printf("File Date : %s\n", asctime(localtime(&(buf->st_mtime))));
#endif

   if ((buf->st_mtime >= ftime) && (buf->st_mtime <= ttime))
      return(0);
   else return(1);
    
   } /* selectFile */

int main(argc, argv)
   int argc;
   char** argv;
   { /* main */
   if (argc != 4)
      {
      fprintf(stderr, 
      "Usage: selectFile <file> <fromDate(YYMMDD)> <toDate(YYMMDD)>\n");
      exit(1);
      };
    
   if (!(selectFile(argv[1], argv[2], argv[3])))
      {
#ifdef TEST
      printf("%s not selected\n", argv[1]);
#endif
      return(0);
      }
   else return(1);

   } /* main */

manoj@hpldsla.sid.hp.com (Manoj Joshi) (10/26/90)

I got a lot of interesting mail from people on the net which was 
very hclosest way to solve this problem. I found that somehow the mtime
and ctime options of find are not to accurate. Besides, I founI had to write a shell script anyway which find. So I decided instead to write a shell script whicfiles in a dir, and uses a c program to check itime interval condition. The performance was great, it's lightning 
fast on my 12 mip w/s. Anyway, I have included these here for peoplcuriosity. I can mbut here it is only on an experimental basis. (For instance, I think 
the comparison loop should exit as soon as the first mismatch is founsince, the -t option of ls ensures the files are scanned in the 
chronological order.)

With this script I could archive files between two dates. And it is 
accurate about that. It will not be too hard to implement exact times. 
In the long run, I would the files in the sam

/*********************************************************************/
/*  EXAMPLE LISTING */
/*********************************************************************/

#!/bin/ksh
# Declaration of variables

hostName=$1
instName=$2
fromDate=$3
toDate=$4
selectList=""
searchDir=$DATA_DIR/$hostName/hpchem/$instName/data
currentDir=`pwd`
cd $searchDir

list=`ls -Rrt`
for currentFido
   $currentDir/selectFi   result=$?
   if [ result -eq 0 ]
   then
      selectList="$selectList $currentFi   fi
done
echo tar -cvf /dev/update.src $selectList
cd $currentDir


/*********************************************************************/
/*  EXAMPLE LISTING */
/*********************************************************************/


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>

int selectFile(file, fromDate, toDate)
   char* file; 
   char* fromDate; 
   char* toDate;
   { /* selectFi   struct stat *buf;
   struct tm *timeptr1;
   struct tm *timeptr2;
   time_t ftime;
   time_t ttime;

   int fDate = (int)atoi(fromDate);
   int tDate = (int)atoi(toDate);

   buf = (struct stat *)malloc(sizeof(struct stat));
   memset(buf, '\0', sizeof(struct stat));

   if (stat(file, buf))
      {
      perror("stat");
            };

   timeptr1 = (struct tm *)malloc(sizeof(struct tm));
   memset(timeptr1, '\0', sizeof(struct tm));
   timeptr1->tm_sec = 0;
   timeptr1->tm_min = 0;
   timeptr1->tm_hour = 0;
   timeptr1->tm_mday = fDate%100;
   timeptr1->tm_mon = (fDate/100)%100-1;
   timeptr1->tm_year = (fDate/10000)%100;
   timeptr1->tm_wday = 0;
   timeptr1->tm_yday = 0;
   timeptr1->tm_isdst = -1;
    
   timeptr2 = (struct tm *)malloc(sizeof(struct tm));
   memset(timeptr2, '\0', sizeof(struct tm));
   timeptr2->tm_sec = 59;
   timeptr2->tm_min = 59;
   timeptr2->tm_hour = 23;
   timeptr2->tm_mday = tDate%100;
   timeptr2->tm_mon = (tDate/100)%100-1;
   timeptr2->tm_year = (tDate/10000)%100;
   timeptr2->tm_wday = 0;
   timeptr2->tm_yday = 0;
   timeptr2->tm_isdst = -1;

   if ((ftime = mktime(timeptr1)) == (time_t)-1)
      {
      perror("mktime");
            };

   if ((ttime = mktime(timeptr2)) == (time_t)-1)
      {
      perror("mktime");
            };

#ifdef TEST
   printf("From Date : %s\n", asctime(timeptr1));
   printf("To Date : %s\n", asctime(timeptr2));
   printf("Fi#endif

   if ((buf->st_mtime >= ftime) && (buf->st_mtime <= ttime))
         else     
   } /* selectFi
int main(argc, argv)
   int argc;
   char** argv;
   { /* main */
   if (argc != 4)
      {
      fprintf(stderr, 
      "Usage: selectFi      exit(1);
      };
    
   if (!(selectFile(argv[1], argv[2], argv[3])))
      {
#ifdef TEST
      printf("%s not selected\n", argv[1]);
#endif
      return(0);
      }
   else 
   } /* main */
#! rnews 2842
Path: rebel!gatech!ncar!husc6!encore!mpheters
From: mpheters@encore.Subject: Re: AMC -- sketchy update for Wed., Oct. 25