Files with 0 file size and created today

hi,

I am building a script to identify those files created/modified today and with file size 0. I am able to find the files with 0 file size and created/modified in last 24 hrs as shown below but not today (current date), I tried using (touch -t time filenm) but in my version of unix at work it does not allow me to, please post if somebody has an alternative solution,

Here is my current script,

cd /usr/local/upload;
for i in *;do
if [ -f $i ];then
if [ ! -s $i ];then
find $i -type f -mtime -1;
fi
fi
done >> usr/file3.txt

Thanks for looking into it.

The touch method is the one you want, what error do you get when you try touch?

Following is the error I get

usage: touch [-amcf] file ...

hmm. Are you on solaris - is there a modern version of touch in the xpg4 directory?

If all else fails -- Here is some older code that sets filetimes. You can try it.

/* 	mytouch.c  set file mtime & atime        
   	usage: mytouch newfiletime  [file ... ]
   	      source | mytouch newfiletime
	where newfiletime is ONLY one of
	YYYY-mm-dd or today or yesterday
	POSIX.1 version
*/
#define  _INCLUDE_POSIX_SOURCE
#include <utime.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>
#include <errno.h>
#ifndef PATH_MAX
#define PATH_MAX _POSIX_PATH_MAX
#endif
static char *fmt="%Y-%m-%d";

void usage()/* error message */
{
	fprintf(stderr,"%s%s%s",
		"usage: mytouch newfiletime  [file ... ]\n",
		" where newfiletime is ONLY one of: \n",
		"  YYYY-mm-dd (YYYY is 1970-2037)\n  today\n  yesterday\n");
	exit(1);
}

char *today(int which)  /* yesterday & today only */
{
	static char t[80]={0x0};
	time_t lt=time(NULL)-(86400 * which);

	struct tm *tmptr=localtime(&lt);
	(void)strftime(t, sizeof(t), fmt, tmptr);

	return t;
}
/* create struct tm for date desired*/
time_t conv(const char *tspec)
{
	struct tm tms;
	char tmp[80]={0x0};
	int yr=0;

    strcpy(tmp, tspec);
	if(strcmp(tmp, "today")== 0)
		strcpy(tmp, today(0));
	if(strcmp(tmp, "yesterday")== 0)
		strcpy(tmp, today(1));
	yr=atoi(tmp);	
	if( yr > 2037 || yr < 1970 || strptime(tmp, fmt, &tms)==NULL)
		usage();

	return mktime(&tms);
}
/* check file existence && create - set mtime && atime*/
void set_utimes(char *filespec, struct utimbuf *ut)
{	
	FILE *tmp=NULL;

	if(access(filespec, F_OK)== -1 )
	{
		tmp=fopen(filespec, "a");
		if(tmp!=NULL)
			(void)fclose(tmp);
		else
		{
			perror("Cannot create file");
			exit(1);
		}
	}
	if(utime(filespec, ut)== -1)
	{
		perror("File access error");
		exit(1);
	}
}

char *check(char *value, const size_t len) /*limited validation*/
{
	if(*value && memchr(value, 0, len + 1)!=NULL)
	{
		char *p=strchr(value, '\n');
		if(p!=NULL) *p=0x0;
		for(p=value; *p && isprint(*p); p++);
		if(*p)
			usage();
		return value;
	}
	usage(); /* everything else is an error */
}

int main(int argc, char **argv)
{
	char filename[PATH_MAX]={0x0};
	int i=0;

	if(argc > 1)
	{
		time_t when = conv(check(argv[1], 10 ));
		struct utimbuf ut={when, when};
		if(argc > 2)
			for(i=2; i < argc; i++)
			   set_utimes(check(argv, PATH_MAX), &ut);

		if(argc == 2)
			while(fgets(filename, sizeof(filename), stdin)!=NULL)
                set_utimes(check(filename, PATH_MAX), &ut);
	}
	if(argc== 1)
		usage();

	return  0;
}

although, it can probably be simplified...

> cat today_empty.sh
#! /usr/bin/bash
# script to show empty files created on this day
# original posting to www.unix.com


ls >today_empty_mylist
month=$(ls -l today_empty_mylist | awk '{print $6}')
day=$(ls -l today_empty_mylist | awk '{print $7}')
#echo $month $day

while read myfile
   do
   if [ -s $myfile ]
      then
      continue
   fi

#   ls -l $myfile

   ls -l $myfile | awk -v mon=$month -v day=$day '$6==mon && $7==day {print $9}'
done<today_empty_mylist 

Isnt this what you want?

find . -ctime -1 -type f -size 0 -exec ls -l {} \;

My bad, you want just current date...

This is kinda crude but it could work:

find . -ctime -1 -type f -size 0 -exec ls -l {} \;  | grep "`date '+%b %d`"

EDIT:
Problem ran into with previous,:
If date is 1 digit it gives "Dec 01", where ls -l is in "Dec 1" format, on my CentOS anyway.

I think this is the issue
The old version of touch does not allow the creation of a filetime on a comparison file,

  • for example the OP wants to be able to create a file with a filetime like this:
-rw-rw-rw-   1 jmcnama    prog             0 Nov 21 00:00 a.lis

Where Nov 21 00:00 has to be dynamic, and is today's first second.

ctime is just the time the inode was changed - nothing else. It is not a create date - they do not exist in standard UNIX.

If the OP has perl v 5.8 you can write perl code to do this. I posted ancient POSIX.1 C code that does that and some other stuff - poorly. If we knew the OS and version it might help. If the OP could compile gnu version of touch that would be good.

Otherwise I have misunderstood completely.

If im correct, it should still work UNLESS they are worried about it finding a file that was "CREATED" before todays date BUT WAS emptied today.

It will find any file created today OR emptied today, correct?