#!/usr/bin/ksh93 ################################################################ #### Program: find_k93 #### #### Description: Emulation of the Unix "find" command. #### #### Currently only supports the -name, -type, and -print options. #### The valid types supported with the -type option are d, f, and l. #### #### Author: Dana French (dfrench@mtxia.com) #### #### Date: 07/27/2004 #### ################################################################ function find_k93 { typeset TRUE="0" typeset FALSE="1" typeset BASEDIR="${PWD}" typeset NAME="${FALSE}" typeset TYPE="${FALSE}" typeset PRINT="${TRUE}" typeset EXEC="${EXEC}" ARGS=( "${@}" ) OPTIND="0" DIRS=( "${@:%%[[:blank:]]-*}" ) [[ "_${DIRS[0]}" = "_" ]] && DIRS[0]="." while getwordopts_k93 "name:,type:,print,?" OPTION ARGS do case "${OPTION}" in 'name' ) (( NAME = TRUE )) NAMEPAT="${OPTARG}";; 'type' ) (( TYPE = TRUE )) TYPEPAT="${OPTARG}";; 'print' ) (( PRINT = TRUE ));; 'exec' ) (( EXEC = TRUE ));; '?' ) print -u 2 "Syntax: find_k93 [DIRECTORY]... [-name PATTERN] [-type d|f|l] [-print]";; esac done for DIR in "${DIRS[@]}" do findfiles_k93 "${BASEDIR}" "${DIR}" | while read -r -- LINE do SHOWLINE="${TRUE}" (( NAME == TRUE )) && [[ "_${LINE##*/}" != _${NAMEPAT} ]] && SHOWLINE="${FALSE}" (( TYPE == TRUE )) && [[ "_${TYPEPAT}" = "_f" ]] && [[ ! -f "${LINE}" ]] && SHOWLINE="${FALSE}" (( TYPE == TRUE )) && [[ "_${TYPEPAT}" = "_d" ]] && [[ ! -d "${LINE}" ]] && SHOWLINE="${FALSE}" (( TYPE == TRUE )) && [[ "_${TYPEPAT}" = "_l" ]] && [[ ! -h "${LINE}" ]] && SHOWLINE="${FALSE}" (( SHOWLINE == TRUE )) && print -r -- "${LINE}" done done } ################################################################ function findfiles_k93 { typeset BASEDIR="${1}" typeset DIR="${2}" typeset FNAME if [[ -d "${BASEDIR}" ]] then cd "${BASEDIR}" if [[ -d "${DIR}" ]] then print -r -- "${DIR}" if cd "${DIR}" > /dev/null 2>&1 then for FNAME in .+([!.]) * do [[ "_${FNAME}" = '_.+([!.])' ]] && continue [[ "_${FNAME}" = '_*' ]] && continue if [[ -d "${FNAME}" ]] then findfiles_k93 "${BASEDIR}" "${DIR}/${FNAME}" cd "${BASEDIR}" > /dev/null 2>&1 cd "${DIR}" > /dev/null 2>&1 else print -r -- "${DIR}/${FNAME}" fi done else print -u 2 -r -- "find_k93: cannot change directory to <${DIR}>:" print -u 2 -r -- " : The file access permissions do not allow the specified action." fi fi fi return 0 } ################################################################ getwordopts_k93 () { typeset TRUE=0 typeset FALSE=1 IFS=",${IFS}" OPTIONLIST=( ${1} ) OPTION="" OPTARG="" while (( OPTIND < ${#ARGS[*]} )) do CLN="${ARGS[OPTIND]}" if [[ "_${CLN}" == _-* ]] then for OPT in "${OPTIONLIST[@]}" do OPTION="${OPT%+(:)}" if [[ "_${CLN#-}" == "_${OPTION}" ]] then LAST="${#OPTION}" if [[ "_${OPT:LAST:1}" == "_:" ]] then if [[ "_${ARGS[OPTIND+1]}" == _-* ]] then print -u 2 -- "${CLN}: invalid argument" (( OPTIND = OPTIND + 1 )) return ${TRUE} else OPTARG="${ARGS[OPTIND+1]}" (( OPTIND = OPTIND + 2 )) return ${TRUE} fi fi (( OPTIND = OPTIND + 1 )) return ${TRUE} fi done print -u 2 -- "${CLN}: invalid option" (( OPTIND = OPTIND + 2 )) return ${TRUE} fi (( OPTIND = OPTIND + 1 )) done return ${FALSE} } ################################################################ find_k93 "${@}"