# bash completion for GNU find. This makes heavy use of ksh style extended # globs and contains Linux specific code for completing the parameter # to the -fstype option. have find && _find() { local cur prev i exprfound onlyonce COMPREPLY=() cur=`_get_cword` prev=${COMP_WORDS[COMP_CWORD-1]} case "$prev" in -@(max|min)depth) COMPREPLY=( $( compgen -W '0 1 2 3 4 5 6 7 8 9' -- "$cur" ) ) return 0 ;; -?(a|c)newer|-fls|-fprint?(0|f)|-?(i)?(l)name|-?(i)wholename) _filedir return 0 ;; -fstype) # this is highly non-portable [ -e /proc/filesystems ] && COMPREPLY=( $( compgen -W "$( cut -d$'\t' -f2 /proc/filesystems )" \ -- "$cur" ) ) return 0 ;; -gid) _gids return 0 ;; -group) COMPREPLY=( $( compgen -g -- "$cur" 2>/dev/null) ) return 0 ;; -?(x)type) COMPREPLY=( $( compgen -W 'b c d p f l s' -- "$cur" ) ) return 0 ;; -uid) _uids return 0 ;; -user) COMPREPLY=( $( compgen -u -- "$cur" ) ) return 0 ;; -exec|-ok) COMP_WORDS=(COMP_WORDS[0] "$cur") COMP_CWORD=1 _command return 0 ;; -[acm]min|-[acm]time|-?(i)?(l)?(whole)name|-inum|-?(i)path|-?(i)regex| \ -links|-perm|-size|-used|-printf) # do nothing, just wait for a parameter to be given return 0 ;; esac _expand || return 0 # set exprfound to 1 if there is already an expression present for i in ${COMP_WORDS[@]}; do [[ "$i" = [-\(\),\!]* ]] && exprfound=1 && break done # handle case where first parameter is not a dash option if [ "$exprfound" != 1 ] && [[ "$cur" != [-\(\),\!]* ]]; then _filedir -d return 0 fi # complete using basic options COMPREPLY=( $( compgen -W '-daystart -depth -follow -help -maxdepth \ -mindepth -mount -noleaf -version -xdev -amin -anewer \ -atime -cmin -cnewer -ctime -empty -false -fstype \ -gid -group -ilname -iname -inum -ipath -iregex \ -wholename \ -links -lname -mmin -mtime -name -newer -nouser \ -nogroup -perm -regex -size -true -type -uid -used \ -user -xtype -exec -fls -fprint -fprint0 -fprintf -ok \ -print -print0 -printf -prune -ls -wholename -iwholename' -- "$cur" ) ) # this removes any options from the list of completions that have # already been specified somewhere on the command line, as long as # these options can only be used once (in a word, "options", in # opposition to "tests" and "actions", as in the find(1) manpage). onlyonce=' -daystart -depth -follow -help -maxdepth -mindepth -mount \ -noleaf -version -xdev ' COMPREPLY=( $( echo "${COMP_WORDS[@]}" | \ (while read -d ' ' i; do [ "$i" == "" ] || [ "${onlyonce/ ${i%% *} / }" == "$onlyonce" ] && continue # flatten array with spaces on either side, # otherwise we cannot grep on word boundaries of # first and last word COMPREPLY=" ${COMPREPLY[@]} " # remove word from list of completions COMPREPLY=( ${COMPREPLY/ ${i%% *} / } ) done echo "${COMPREPLY[@]}") ) ) _filedir return 0 } && complete -F _find -o filenames find # Local variables: # mode: shell-script # sh-basic-offset: 4 # sh-indent-comment: t # indent-tabs-mode: nil # End: # ex: ts=4 sw=4 et filetype=sh