isBetween
- Determine if the last modification date/time on
a file is between two specified date/time values. The date/time values
required consist of a beginning and an ending date/time, and are
expected to be in the following format: YYYY-MM-DD HH:MM:SS
#!/usr/bin/ksh93
################################################################
function usagemsg_isBetween {
print "
Program: isBetween
The function \"isBetween\" will determine if the modification date/time
of a file is between two specified dates.
Usage: ${1##*/} [-?vVq] [-b 'BeginDate'] [-e 'EndDate'] FileName
Where:
-b 'YYYY-MM-DD HH:MM:SS' = Beginning Date/Time (Default:Current)
-e 'YYYY-MM-DD HH:MM:SS' = Ending Date/Time (Default:Current)
FileName = File to examine to determine if the modification date/time
is between the specified beginning and ending date/time's.
-v = Verbose mode
-V = Very Verbose Mode
-q = Quiet mode
Author: Dana French (dfrench@mtxia.com) Copyright 2004
\"AutoContent\" enabled
"
}
################################################################
####
#### Description:
####
#### This function will determine if the last modification
#### date/time on a file is between two specified date/time
#### values. The date/time values required consist of a
#### beginning and an ending date/time, and are expected to
#### be in the following format: YYYY-MM-DD HH:MM:SS
####
#### Where YYYY represents the four digit year, MM is the 2
#### digit month number (1-12), DD is the 2 digit day of the
#### month (1-31), HH is the 2 digit hour of the day on a 24
#### hour clock (0-23), MM is the 2 digit minute value
#### (0-59), and SS is the 2 digit seconds value (0-59).
####
#### Assumptions:
####
#### If the beginning date/time or ending date/time is not
#### specified, the current date/time is used as the default
#### value.
####
#### Dependencies:
####
#### This function requires execute permission for the "ls"
#### and "date" commands.
####
#### Products:
####
#### This function examines one file at a time and produces a
#### return code of zero (0) if the last modification time of
#### the file is between or equal to the specified date/time
#### values. A return code of one (1) is produced if the
#### last modification time of the file is not between the
#### specified date/time values. A return code of two (2) is
#### produced if the file to examine is not found. And a
#### return code of three (3) is produced if the date
#### information obtained from the "ls -l" output is invalid.
####
#### The VERBOSE option causes this function to output the
#### beginning time, ending time, file datestamp, and file
#### name. The QUIET option causes this function to perform
#### it's work quietly and not produce any output. If both
#### the VERBOSE and QUIET flags are specified at run time,
#### the VERBOSE flag has precedence.
####
#### Configured Usage:
####
#### This command is a shell function that can be
#### incorporated into other shell scripts, used as part of a
#### function library, or as a stand-alone command.
####
#### Details:
####
################################################################
function isBetween {
typeset TRUE="1"
typeset FALSE="0"
typeset EXITCODE="0"
typeset QUIET="${FALSE}"
typeset VERBOSE="${FALSE}"
typeset VERYVERB="${FALSE}"
typeset TZ="GMT"
typeset LC_ALL="C"
export TZ LC_ALL
typeset CURDT="$( date +'%Y-%m-%d %H:%M:%S' )"
typeset MIN=$( printf '%(%s)T' "${CURDT}" ) # (GMT)
typeset MAX=$( printf '%(%s)T' "${CURDT}" ) # (GMT)
typeset FTYPE
typeset FNAME
typeset X1 X2 X3 X4
typeset D1 D2 D3
while getopts ":vVqb:e:" OPTION
do
case "${OPTION}" in
'q') QUIET="${TRUE}";;
'v') VERBOSE="${TRUE}";;
'V') VERYVERB="${TRUE}";;
'b') MIN=$( printf '%(%s)T' "${OPTARG}" );;
'e') MAX=$( printf '%(%s)T' "${OPTARG}" );;
'?') usagemsg_isBetween "${0}" && exit 1 ;;
esac
done
shift $(( ${OPTIND} - 1 ))
typeset TARGFILE="${1}"
trap "usagemsg_isBetween ${0}" EXIT
if (( MAX < MIN ))
then
(( QUIET == FALSE )) &&
print -u 2 "ERROR: MIN (${MIN}) is greater than MAX (${MAX})"
exit 2
fi
if [[ "_${TARGFILE}" = "_" ]]
then
(( QUIET == FALSE )) &&
print -u 2 "ERROR: Filename to examine not specified"
exit 3
fi
trap "-" EXIT
(( VERYVERB == TRUE )) && set -x
################################################################
#### Obtain a long listing of the file attributes for the
#### target file, and read them into shell variables.
if ! ls -ld "${TARGFILE}" 2>/dev/null | IFS=$' \t\n' read -r FTYPE X1 X2 X3 X4 D1 D2 D3 FNAME
then
(( QUIET == FALSE )) &&
print -u 2 "ERROR: Specified file not found: ${TARGFILE}"
return 2
fi
#### Verify each date variable contains a value, if not issue
#### an error message and return with an unsuccessful return
#### code.
if [[ "_${D1}" = "_" || "_${D2}" = "_" || "_${D3}" = "_" ]]
then
(( QUIET == FALSE )) &&
print -u 2 "ERROR: Invalid date information for file ${FNAME}"
return 3
fi
#### Using the date values read in from the long listing
#### output for the target file, convert the date into
#### seconds from the last epoch using the "printf" built-in
#### command.
DATESTAMP=$( printf '%(%s)T' "${D1} ${D2} ${D3}" )
#### Check the file type of the target file and if it is a
#### symbolic link, delete the pointer information from the
#### end of the filename.
if [[ "${FTYPE}" = l* ]]
then
FNAME="${FNAME/ -> */}"
fi
#### If the VERBOSE flag is TRUE, then output the beginning
#### time, ending time, file timestamp, and the file
#### name, regardless of whether or not it falls between the
#### beginning and ending date/time values.
if (( VERBOSE == TRUE ))
then
print -- "# Begin\t\tEnd\t\tFile Date\tFile Name"
print -- "${MIN}\t${MAX}\t${DATESTAMP}\t${FNAME}"
fi
#### Check the datestamp of the target file to see if falls
#### between the specified beginning time and ending time.
if (( DATESTAMP >= MIN )) && (( DATESTAMP <= MAX ))
then
#### If the last modification date of the target file is
#### between the specified date/time values, the value of the
#### VERBOSE option is FALSE, and the QUIET option is FALSE,
#### output the filename. Otherwise, if the QUIET option is
#### TRUE, output nothing.
if (( VERBOSE == FALSE ))
then
(( QUIET == FALSE )) &&
print -r -- "${FNAME}"
fi
#### If the last modification date of the target file is
#### between the specified times, return from this
#### function with a successful return code.
return 0
fi
#### If the last modification date of the target file is
#### NOT between the specified times, return from this
#### function with an unsuccessful return code.
return 1
}
################################################################
isBetween "${@}"