summaryrefslogtreecommitdiff
path: root/completions/find
blob: 2afb6fc95bc365850ab0c3082e9b1ec7c62bb999 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# bash completion for GNU find                             -*- shell-script -*-
# This makes heavy use of ksh style extended globs and contains Linux specific
# code for completing the parameter to the -fstype option.

_find()
{
    local cur prev words cword
    _init_completion || return

    case $prev in
        -maxdepth|-mindepth)
            COMPREPLY=( $( compgen -W '{0..9}' -- "$cur" ) )
            return 0
            ;;
        -newer|-anewer|-cnewer|-fls|-fprint|-fprint0|-fprintf|-name|-iname|\
        -lname|-ilname|-wholename|-iwholename|-samefile)
            _filedir
            return 0
            ;;
        -fstype)
            _fstypes
            [[ $OSTYPE == *bsd* ]] && \
                COMPREPLY+=( $( compgen -W 'local rdonly' -- "$cur" ) )
            return 0
            ;;
        -gid)
            _gids
            return 0
            ;;
        -group)
            COMPREPLY=( $( compgen -g -- "$cur" 2>/dev/null) )
            return 0
            ;;
        -xtype|-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|-execdir|-ok|-okdir)
            words=(words[0] "$cur")
            cword=1
            _command
            return 0
            ;;
        -[acm]min|-[acm]time|-iname|-lname|-wholename|-iwholename|-lwholename|\
        -ilwholename|-inum|-path|-ipath|-regex|-iregex|-links|-perm|-size|\
        -used|-printf|-context)
            # do nothing, just wait for a parameter to be given
            return 0
            ;;
        -regextype)
            COMPREPLY=( $( compgen -W 'emacs posix-awk posix-basic \
                posix-egrep posix-extended' -- "$cur" ) )
            return 0
            ;;
    esac

    _expand || return 0

    local i exprfound=false
    # set exprfound to true if there is already an expression present
    for i in ${words[@]}; do
        [[ "$i" = [-\(\),\!]* ]] && exprfound=true && break
    done

    # handle case where first parameter is not a dash option
    if ! $exprfound && [[ "$cur" != [-\(\),\!]* ]]; then
        _filedir -d
        return 0
    fi

    # complete using basic options
    COMPREPLY=( $( compgen -W '-daystart -depth -follow -help \
        -ignore_readdir_race -maxdepth -mindepth -mindepth -mount \
        -noignore_readdir_race -noleaf -regextype -version -warn -nowarn \
        -xdev \
        -amin -anewer -atime -cmin -cnewer -ctime -empty -executable -false \
        -fstype -gid -group -ilname -iname -inum -ipath -iregex -iwholename \
        -links -lname -mmin -mtime -name -newer -nogroup -nouser -path -perm \
        -readable -regex -samefile -size -true -type -uid -used -user \
        -wholename -writable -xtype -context \
        -delete -exec -execdir -fls -fprint -fprint0 -fprintf -ls -ok -okdir \
        -print -print0 -printf -prune -quit' -- "$cur" ) )

    if [[ ${#COMPREPLY[@]} -ne 0 ]]; then
        # 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).
        local -A onlyonce=( [-daystart]=1 [-depth]=1 [-follow]=1 [-help]=1
            [-ignore_readdir_race]=1 [-maxdepth]=1 [-mindepth]=1 [-mount]=1
            [-noignore_readdir_race]=1 [-noleaf]=1 [-nowarn]=1 [-regextype]=1
            [-version]=1 [-warn]=1 [-xdev]=1 )
        local j
        for i in "${words[@]}"; do
            [[ $i && ${onlyonce[$i]} ]] || continue
            for j in ${!COMPREPLY[@]}; do
                [[ ${COMPREPLY[j]} == $i ]] && unset COMPREPLY[j]
            done
        done
    fi

    _filedir

    return 0
} &&
complete -F _find find

# ex: ts=4 sw=4 et filetype=sh