summary refs log tree commit diff
path: root/Completion/Unix/Command/_find
blob: 74111f92bf06eb8af310cf7491706e409e6fe6aa (plain) (blame)
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#compdef find gfind

local curcontext="$curcontext" state_descr variant default ret=1
local -a state line args alts disp smatch

_pick_variant -r variant gnu=GNU $OSTYPE -version

case $variant in
  solaris*)
    args+=(
      '*-'{n,}'cpio:device:_files'
      '*-local'
    )
  ;|
  solaris*|darwin*)
    args+=( '*-xattr' )
  ;|
  solaris2.<10->|freebsd*|darwin*)
    args+=( '*-acl' )
  ;|
  solaris2.<11->|freebsd*|dragonfly*|darwin*|openbsd*|gnu)
    args+=(
      '*-amin:access time (minutes)'
      '*-cmin:inode change time (minutes)'
      '*-mmin:modification time (minutes)'
      '*-iname:name pattern to match (case insensitive)'
      '*-print0'
    )
  ;|
  solaris*|freebsd*|dragonfly*|darwin*|gnu)
    args+=( '*-mount' )
  ;|
  netbsd*|freebsd*|dragonfly*|darwin*|gnu)
    args+=( '(-H -L)-P[never follow symlinks]' )
  ;|
  darwin*|freebsd*|gnu)
    args+=(
      '*-Bmin:birth time (minutes)'
      '*-Bnewer:file to compare (birth time):_files'
      '*-Btime:birth time (hours)'
    )
  ;|
  netbsd*|freebsd*|dragonfly*|openbsd*|darwin*|gnu)
    args+=(
      '-d[depth first traversal]'
      '*-anewer:file to compare (access time):_files'
      '*-cnewer:file to compare (inode change time):_files'
      '*-empty'
      '*-execdir:program: _command_names -e:*\;::program arguments: _normal'
      '*-maxdepth:maximum search depth'
      '*-mindepth:minimum search depth'
      '*-path:path pattern to search:'
    )
  ;|
  freebsd*|dragonfly*|darwin*|gnu)
    args+=(
      '*-delete'
      '*-gid:numeric group ID'
      '*-uid:numeric user ID'
      '*-noleaf'
      '*-lname:link pattern to search'
      '*-ilname:link pattern to search (case insensitive)'
      '*-ipath:path pattern to search (case insensitive)'
      '*-regex:regular expression to search'
      '*-iregex:regular expression to search (case insensitive)'
      '*-wholename:full path pattern to search' \
      '*-iwholename:full path pattern to search (case insensitive)'
      '*-ignore_readdir_race'
      '*-mnewer:file to compare (modification time):_files'
      '*-noignore_readdir_race'
      '*-okdir:program: _command_names -e:*\;::program arguments: _normal'
      '*-samefile:file to compare inode:_files' \
      '*-true'
      '*-false'
      '*-and'
      '*-or'
      '*-not'
    )
  ;|
  freebsd*|dragonfly*|gnu) args+=( '*-quit' ) ;|
  netbsd*|freebsd*|dragonfly*|darwin*)
    args+=(
      '-E[use extended regular expressions with -regex/-iregex]'
      '-s[traverse directories in sorted order]'
    )
  ;|
  netbsd*|freebsd*|dragonfly*|openbsd*|darwin*)
    args+=(
      '-X[warn if filename contains characters special to xargs]'
      '-f[specify file hierarchy to traverse]:path:_directories'
      "-x[don't span filesystems]"
      '*-flags:flag:_chflags'
    )
  ;|
  freebsd*|dragonfly*) args+=( '*-sparse' ) ;|
  darwin*) args+=( '*-xattrname:name' ) ;|
  gnu)
    args+=(
      '(- *)-help' '(-)--help'
      '(- *)-version' '(-)--version'
      '-D[print diagnostics]:debug option:(exec opt rates search stat time tree all help)'
      '-O+[enable query optimisation]:level:(1 2 3)'
      '*-daystart'
      '-regextype:regexp syntax:(help findutils-default awk egrep ed emacs gnu-awk grep posix-awk posix-basic posix-egrep posix-extended posix-minimal-basic sed)'
      '*-warn'
      '*-nowarn'
      '*-xautofs'
      '*-used:access after inode change (days)'
      '*-executable'
      '*-readable'
      '*-writable'
      '*-xtype:file type:((b\:block\ special\ file c\:character\ special\ file d\:directory p\:named\ pipe f\:normal\ file l\:symbolic\ link s\:socket))'
      '*-fls:output file:_files'
      '*-fprint:output file:_files'
      '*-fprint0:output file:_files'
      '*-fprintf:output file:_files:output format'
      '*-printf:output format'
    )
    [[ $OSTYPE = linux-gnu ]] && args+=( '*-context:SELinux context (glob pattern):_selinux_contexts' )
  ;;
esac

_arguments -C $args \
  '(-L -P)-H[only follow symlinks when resolving command-line arguments]' \
  '(-H -P)-L[follow symlinks]' \
  '*-atime:access time (days):->times' \
  '*-ctime:inode change time (days):->times' \
  '*-depth' \
  '*-exec:program: _command_names -e:*\;::program arguments: _normal' \
  '*-follow' \
  '*-fstype:file system type:_file_systems' \
  '*-group:group:_groups' \
  '*-inum:inode number:' \
  '*-links:number of links:' \
  '*-ls' \
  '*-mtime:modification time (days):->times' \
  '*-name:name pattern' \
  '*-newer:file to compare (modification time):_files' \
  '*-nogroup' \
  '*-nouser' \
  '*-ok:program: _command_names -e:*\;::program arguments: _normal' \
  '*-perm: :_file_modes' \
  '*-print' \
  '*-prune' \
  '*-size:file size (blocks)' \
  '*-type:file type:((b\:block\ special\ file c\:character\ special\ file d\:directory p\:named\ pipe f\:normal\ file l\:symbolic\ link s\:socket))' \
  '*-user:user:_users' \
  '*-xdev' \
  '*-a' '*-o' \
  '(-D -E -H -L -O -P -f -s -x --help --version)*:directory:_files -/' \
&& ret=0

if [[ $state = times ]]; then
  if ! compset -P '[+-]' || [[ -prefix '[0-9]' ]]; then
    compstate[list]+=' packed'
    if zstyle -t ":completion:${curcontext}:senses" verbose; then
      zstyle -s ":completion:${curcontext}:senses" list-separator sep || sep=--
      default=" [default exactly]"
      disp=( "+ $sep before (older files)" "- $sep since (newer files)" )
      smatch=( - + )
    else
      disp=( before exactly since )
      smatch=( + '' - )
    fi
    alts=( "senses:sense${default}:compadd -V times -S '' -d disp -a smatch" )
  fi
  alts+=( "times:${state_descr}:_dates -f d" )
  _alternative $alts && ret=0
fi

return ret