#!/bin/ksh function list { typeset L_arg O_arg G_arg S_arg a_arg typeset b_arg c_arg d_arg f_arg g_arg k_arg p_arg r_arg u_arg w_arg x_arg typeset args arg_list name arg opt link_arg not sname sa_arg typeset -i i len D_arg=0 while [[ "$1" = -* ]] do if [[ "$1" = -*(-) ]] then shift break fi opt=${1#-} while [[ -n "$opt" ]] do if [[ "${opt%${opt#?}}" = '!' ]] then not='! ' opt="${opt#?}" [[ -z "$opt" ]] && break else not= fi case "${opt%${opt#?}}" in L) L_arg="$not-L" ;; O) O_arg="$not-O" ;; G) G_arg="$not-G" ;; S) S_arg="$not-S" ;; D) D_arg=1 ;; a) a_arg=.* ;; b) b_arg="$not-b" ;; c) c_arg="$not-c" ;; d) d_arg="$not-d" ;; f) f_arg="$not-f" ;; g) g_arg="$not-g" ;; k) k_arg="$not-k" ;; p) p_arg="$not-p" ;; r) r_arg="$not-r" ;; u) u_arg="$not-u" ;; w) w_arg="$not-w" ;; x) x_arg="$not-x" ;; ?) print -- $0: -${opt%${opt#?}}: unknown option print Usage: $0 \[-LOGSabcdfgkpruwx\] \[files\] print All flags can also be preceded by a ! to negate\ their meaning print To list all files with the executable bit not set print -- $0 -!xf return ;; esac opt="${opt#?}" done shift done set -A args -- "$O_arg" "$G_arg" "$S_arg" "$b_arg" "$c_arg" "$d_arg"\ "$f_arg" "$g_arg" "$k_arg" "$p_arg" "$r_arg" "$u_arg"\ "$w_arg" "$x_arg" if (( ! $# )) then set -- $a_arg * D_arg=1 fi len="${#args[@]}" while (( i < len )) do [[ -z "${args[i]}" ]] && unset args[i] (( i += 1 )) done set -A args -- "${args[@]}" for name in "$@"; do link_arg= [[ "$name" = / ]] && link_arg=/ [[ -n "$L_arg" ]] && link_arg=" && $L_arg \"${name%/}$link_arg\"" arg_list="-a \"$name$link_arg\"" for arg in "${args[@]}"; do arg_list="$arg_list && $arg \"$name\"" done if eval "[[ $arg_list ]]"; then print -- "$name" fi if [[ -d "$name" ]] && (( ! D_arg )) then sa_arg= [[ -n "$a_arg" ]] && sa_arg="${name%/}/".* for sname in $sa_arg "${name%/}/"*; do link_arg= [[ "$sname" = / ]] && link_arg=/ [[ -n "$L_arg" ]]\ && link_arg=" && $L_arg \"${sname%/}$link_arg\"" arg_list="-a \"$sname$link_arg\"" for arg in "${args[@]}"; do arg_list="$arg_list && $arg \"$sname\"" done if eval "[[ $arg_list ]]"; then print -- "$sname";fi done fi done } list "$@" # vi:ts=8: