Annotation of src/usr.bin/find/find.1, Revision 1.33
1.33 ! hugh 1: .\" $OpenBSD: find.1,v 1.32 2001/08/22 16:50:50 heko Exp $
1.1 deraadt 2: .\" Copyright (c) 1990, 1993
3: .\" The Regents of the University of California. All rights reserved.
4: .\"
5: .\" This code is derived from software contributed to Berkeley by
6: .\" the Institute of Electrical and Electronics Engineers, Inc.
7: .\"
8: .\" Redistribution and use in source and binary forms, with or without
9: .\" modification, are permitted provided that the following conditions
10: .\" are met:
11: .\" 1. Redistributions of source code must retain the above copyright
12: .\" notice, this list of conditions and the following disclaimer.
13: .\" 2. Redistributions in binary form must reproduce the above copyright
14: .\" notice, this list of conditions and the following disclaimer in the
15: .\" documentation and/or other materials provided with the distribution.
16: .\" 3. All advertising materials mentioning features or use of this software
17: .\" must display the following acknowledgement:
18: .\" This product includes software developed by the University of
19: .\" California, Berkeley and its contributors.
20: .\" 4. Neither the name of the University nor the names of its contributors
21: .\" may be used to endorse or promote products derived from this software
22: .\" without specific prior written permission.
23: .\"
24: .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25: .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26: .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27: .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28: .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29: .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30: .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31: .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32: .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33: .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34: .\" SUCH DAMAGE.
35: .\"
36: .\" from: @(#)find.1 8.1 (Berkeley) 6/6/93
37: .\"
1.24 millert 38: .Dd December 4, 1999
1.1 deraadt 39: .Dt FIND 1
40: .Os
41: .Sh NAME
42: .Nm find
43: .Nd walk a file hierarchy
44: .Sh SYNOPSIS
45: .Nm find
1.19 espie 46: .Op Fl HdhXxW
1.1 deraadt 47: .Op Fl f Ar file
1.32 heko 48: .Ar file Op Ar ...
1.33 ! hugh 49: .Ar expression
1.1 deraadt 50: .Sh DESCRIPTION
1.22 aaron 51: .Nm
1.1 deraadt 52: recursively descends the directory tree for each
53: .Ar file
54: listed, evaluating an
55: .Ar expression
1.22 aaron 56: (composed of the
57: .Dq primaries
58: and
1.33 ! hugh 59: .Dq operands
1.22 aaron 60: listed below) in terms
1.12 millert 61: of each file in the tree.
1.1 deraadt 62: .Pp
63: The options are as follows:
64: .Bl -tag -width Ds
65: .It Fl H
1.16 aaron 66: Causes the file information and file type (see
1.22 aaron 67: .Xr stat 2 )
68: returned for each symbolic link encountered on the command line to be
1.1 deraadt 69: those of the file referenced by the link, not the link itself.
70: If the referenced file does not exist, the file information and type will
1.25 aaron 71: be for the link itself.
72: File information of all symbolic links not on
1.1 deraadt 73: the command line is that of the link itself.
74: .It Fl d
1.16 aaron 75: Causes
1.22 aaron 76: .Nm
77: to perform a depth-first traversal, i.e., directories
78: are visited in post-order and all entries in a directory will be acted
1.1 deraadt 79: on before the directory itself.
80: By default,
1.22 aaron 81: .Nm
82: visits directories in pre-order, i.e., before their contents.
1.1 deraadt 83: Note, the default is
1.22 aaron 84: .Em not
85: a breadth-first traversal.
1.16 aaron 86: .It Fl f Ar file
87: Specifies a file hierarchy for
1.22 aaron 88: .Nm
1.1 deraadt 89: to traverse.
90: File hierarchies may also be specified as the operands immediately
91: following the options.
92: .It Fl h
1.16 aaron 93: Causes the file information and file type (see
1.22 aaron 94: .Xr stat 2 )
1.1 deraadt 95: returned for each symbolic link to be those of the file referenced by the
96: link, not the link itself.
97: If the referenced file does not exist, the file information and type will
98: be for the link itself.
99: .It Fl X
1.16 aaron 100: Permit
1.1 deraadt 101: .Nm
102: to be safely used in conjunction with
103: .Xr xargs 1 .
104: If a file name contains any of the delimiting characters used by
105: .Xr xargs ,
106: a diagnostic message is displayed on standard error, and the file
107: is skipped.
1.22 aaron 108: The delimiting characters include single
109: .Pq Ql '
110: and double
111: .Pq Ql \&"
112: quotes, backslash
113: .Pq Ql \e ,
114: space, tab, and newline
115: .Pq Sq \en
116: characters.
1.4 deraadt 117: As an alternative, the
118: .Fl print0
119: function may be used safely in conjunction with the
120: .Fl 0
121: argument to
1.16 aaron 122: .Xr xargs 1 .
1.1 deraadt 123: .It Fl x
1.16 aaron 124: Prevents
1.22 aaron 125: .Nm
1.1 deraadt 126: from descending into directories that have a device number different
127: than that of the file from which the descent began.
1.19 espie 128: .It Fl W
129: Let
130: .Nm
131: take whiteouts into account when scanning directories.
1.1 deraadt 132: .El
133: .Sh PRIMARIES
134: .Bl -tag -width Ds
1.22 aaron 135: .It Ic -amin Ar n
1.15 deraadt 136: True if the difference between the file last access time and the time
1.22 aaron 137: .Nm
1.20 aaron 138: was started, rounded up to the next full minute, is
1.15 deraadt 139: .Ar n
1.20 aaron 140: minutes.
1.24 millert 141: .It Ic -anewer Ar file
142: True if the current file has a more recent last access time than
1.25 aaron 143: .Ar file .
1.22 aaron 144: .It Ic -atime Ar n
1.1 deraadt 145: True if the difference between the file last access time and the time
1.22 aaron 146: .Nm
147: was started, rounded up to the next full 24-hour period, is
1.1 deraadt 148: .Ar n
1.22 aaron 149: 24-hour periods.
150: .It Ic -cmin Ar n
1.15 deraadt 151: True if the difference between the time of last change of file status
152: information and the time
1.22 aaron 153: .Nm
1.20 aaron 154: was started, rounded up to the next full minute, is
1.15 deraadt 155: .Ar n
1.20 aaron 156: minutes.
1.24 millert 157: .It Ic -cnewer Ar file
158: True if the current file has a more recent last change time than
1.25 aaron 159: .Ar file .
1.22 aaron 160: .It Ic -ctime Ar n
1.1 deraadt 161: True if the difference between the time of last change of file status
162: information and the time
1.22 aaron 163: .Nm
164: was started, rounded up to the next full 24-hour period, is
1.1 deraadt 165: .Ar n
1.22 aaron 166: 24-hour periods.
1.8 tholo 167: .It Ic -empty
168: True if the current file or directory is empty.
1.22 aaron 169: .It Ic -exec Ar utility Op argument ... ;
1.1 deraadt 170: True if the program named
171: .Ar utility
172: returns a zero value as its exit status.
173: Optional arguments may be passed to the utility.
1.22 aaron 174: The expression must be terminated by a semicolon
175: .Pq Ql \&; .
176: If the string
177: .Qq {}
178: appears anywhere in the utility name or the
1.1 deraadt 179: arguments it is replaced by the pathname of the current file.
1.16 aaron 180: .Ar utility
1.1 deraadt 181: will be executed from the directory from which
1.22 aaron 182: .Nm
1.1 deraadt 183: was executed.
1.22 aaron 184: .It Ic -execdir Ar utility Op argument ... ;
185: Identical to the
1.10 millert 186: .Ic -exec
187: primary with the exception that
1.16 aaron 188: .Ar utility
1.10 millert 189: will be executed from the directory that holds
1.25 aaron 190: the current file.
191: The filename substituted for the string
1.22 aaron 192: .Qq {}
193: is not qualified.
1.28 millert 194: .It Xo
195: .Ic -flags
196: .Op Fl
197: .Ar flags
198: .Xc
199: The
200: .Ar flags
201: are comma-separated symbolic file flags (see
202: .Xr chflags 1
203: for a list of valid flag names).
204: If the flags are preceded by a dash
205: .Pq Sq \- ,
206: this primary evaluates to true if the file in question has at least
207: one of the file flags specified by
208: .Ar flags .
209: If the flags are not preceded by a dash, this primary evaluates to true if the
210: flags specified exactly match those of the file.
1.2 deraadt 211: .It Ic -follow
212: Follow symbolic links.
1.22 aaron 213: .It Ic -fstype Ar type
1.1 deraadt 214: True if the file is contained in a file system of type
215: .Ar type .
1.22 aaron 216: Two special file system types are recognized:
217: .Dq local
218: and
219: .Dq rdonly .
1.1 deraadt 220: These do not describe actual file system types;
221: the former matches any file system physically mounted on the system where
1.22 aaron 222: .Nm
223: is being executed whereas the latter matches any file system which is
1.1 deraadt 224: mounted read-only.
1.22 aaron 225: .It Ic -group Ar gname
1.1 deraadt 226: True if the file belongs to the group
1.25 aaron 227: .Ar gname .
1.1 deraadt 228: If
229: .Ar gname
230: is numeric and there is no such group name, then
231: .Ar gname
1.16 aaron 232: is treated as a group ID.
1.27 deraadt 233: .It Ic -iname Ar pattern
234: True if the last component of the pathname being examined
235: matches
236: .Ar pattern .
237: Case insensitive.
1.22 aaron 238: .It Ic -inum Ar n
1.1 deraadt 239: True if the file has inode number
1.25 aaron 240: .Ar n .
1.22 aaron 241: .It Ic -links Ar n
1.1 deraadt 242: True if the file has
243: .Ar n
244: links.
245: .It Ic -ls
246: This primary always evaluates to true.
247: The following information for the current file is written to standard output:
1.22 aaron 248: its inode number, size in 512-byte blocks, file permissions, number of hard
1.1 deraadt 249: links, owner, group, size in bytes, last modification time, and pathname.
250: If the file is a block or character special file, the major and minor numbers
251: will be displayed instead of the size in bytes.
1.22 aaron 252: If the file is a symbolic link, the pathname of the linked-to file will be
253: displayed preceded by
254: .Dq \-> .
255: The format is identical to that produced by
256: .Dq ls \-dgils .
1.6 tholo 257: .It Ic -maxdepth Ar n
1.7 tholo 258: True if the current search depth is less than or equal to what is specified in
259: .Ar n .
260: .It Ic -mindepth Ar n
261: True if the current search depth is at least what is specified in
1.6 tholo 262: .Ar n .
1.22 aaron 263: .It Ic -mmin Ar n
1.15 deraadt 264: True if the difference between the file last modification time and the time
1.22 aaron 265: .Nm
1.20 aaron 266: was started, rounded up to the next full minute, is
1.15 deraadt 267: .Ar n
1.20 aaron 268: minutes.
1.22 aaron 269: .It Ic -mtime Ar n
1.1 deraadt 270: True if the difference between the file last modification time and the time
1.22 aaron 271: .Nm
272: was started, rounded up to the next full 24-hour period, is
1.1 deraadt 273: .Ar n
1.22 aaron 274: 24-hour periods.
275: .It Ic -name Ar pattern
1.1 deraadt 276: True if the last component of the pathname being examined matches
1.25 aaron 277: .Ar pattern .
1.22 aaron 278: Special shell pattern matching characters
279: .Pf ( Ql [ ,
280: .Ql \&] ,
281: .Ql * ,
282: and
283: .Ql ? )
1.1 deraadt 284: may be used as part of
1.25 aaron 285: .Ar pattern .
1.1 deraadt 286: These characters may be matched explicitly by escaping them with a
1.22 aaron 287: backslash
288: .Pq Ql \e .
289: .It Ic -newer Ar file
1.1 deraadt 290: True if the current file has a more recent last modification time than
1.25 aaron 291: .Ar file .
1.1 deraadt 292: .It Ic -nouser
293: True if the file belongs to an unknown user.
294: .It Ic -nogroup
295: True if the file belongs to an unknown group.
1.22 aaron 296: .It Ic \&-ok Ar utility Op argument ... ;
297: Identical to the
298: .Ic -exec
299: primary with the exception that
300: .Nm
301: requests user affirmation for the execution of
302: .Ar utility
303: by printing
304: a message to the terminal and reading a response.
305: If the response is other than
306: .Sq y
307: the command is not executed and the
308: value of the
309: .Ic \&ok
310: expression is false.
311: .It Ic -path Ar pattern
1.1 deraadt 312: True if the pathname being examined matches
1.25 aaron 313: .Ar pattern .
1.22 aaron 314: Special shell pattern matching characters
315: .Pf ( Ql [ ,
316: .Ql \&] ,
317: .Ql * ,
318: and
319: .Ql ? )
1.1 deraadt 320: may be used as part of
1.25 aaron 321: .Ar pattern .
1.1 deraadt 322: These characters may be matched explicitly by escaping them with a
1.22 aaron 323: backslash
324: .Pq Ql \e .
325: Slashes
326: .Pq Ql /
327: are treated as normal characters and do not have to be
1.1 deraadt 328: matched explicitly.
1.21 aaron 329: .It Xo
330: .Ic -perm
331: .Op Fl
332: .Ar mode
333: .Xc
1.1 deraadt 334: The
335: .Ar mode
336: may be either symbolic (see
1.25 aaron 337: .Xr chmod 1 )
1.1 deraadt 338: or an octal number.
339: If the mode is symbolic, a starting value of zero is assumed and the
1.16 aaron 340: mode sets or clears permissions without regard to the process's file mode
1.1 deraadt 341: creation mask.
342: If the mode is octal, only bits 07777
343: .Pf ( Dv S_ISUID
344: |
345: .Dv S_ISGID
346: |
347: .Dv S_ISTXT
348: |
349: .Dv S_IRWXU
350: |
351: .Dv S_IRWXG
352: |
353: .Dv S_IRWXO )
354: of the file's mode bits participate
355: in the comparison.
1.22 aaron 356: If the mode is preceded by a dash
357: .Pq Sq \- ,
358: this primary evaluates to true
1.1 deraadt 359: if at least all of the bits in the mode are set in the file's mode bits.
1.22 aaron 360: If the mode is not preceded by a dash, this primary evaluates to
1.16 aaron 361: true if the bits in the mode exactly match the file's mode bits.
1.22 aaron 362: Note, the first character of a symbolic mode may not be a dash.
1.1 deraadt 363: .It Ic -print
364: This primary always evaluates to true.
365: It prints the pathname of the current file to standard output, followed
1.22 aaron 366: by a newline
367: .Pq Ql \en
368: character.
1.1 deraadt 369: If neither
370: .Ic -exec ,
371: .Ic -ls ,
372: .Ic -ok ,
373: nor
374: .Ic -print0
375: is specified, the given expression shall be effectively replaced by
1.22 aaron 376: .Cm \&( Ns Ar given\& expression Ns Cm \&)
1.1 deraadt 377: .Ic -print .
378: .It Ic -print0
379: This primary always evaluates to true.
380: It prints the pathname of the current file to standard output, followed
381: by a null character.
382: .It Ic -prune
383: This primary always evaluates to true.
384: It causes
1.22 aaron 385: .Nm
1.1 deraadt 386: to not descend into the current file.
387: Note, the
388: .Ic -prune
389: primary has no effect if the
390: .Fl d
391: option was specified.
1.22 aaron 392: .It Ic -size Ar n Ns Op Cm c
393: True if the file's size, rounded up, in 512-byte blocks is
1.25 aaron 394: .Ar n .
1.1 deraadt 395: If
396: .Ar n
1.22 aaron 397: is followed by a
398: .Sq c ,
399: then the primary is true if the
1.1 deraadt 400: file's size is
401: .Ar n
402: bytes.
1.22 aaron 403: .It Ic -type Ar t
1.1 deraadt 404: True if the file is of the specified type.
405: Possible file types are as follows:
406: .Pp
407: .Bl -tag -width flag -offset indent -compact
1.3 deraadt 408: .It Cm W
1.22 aaron 409: whiteout (currently, these won't even be visible without also specifying
1.19 espie 410: .Fl W )
1.1 deraadt 411: .It Cm b
412: block special
413: .It Cm c
414: character special
415: .It Cm d
416: directory
417: .It Cm f
418: regular file
419: .It Cm l
420: symbolic link
421: .It Cm p
422: FIFO
423: .It Cm s
424: socket
425: .El
426: .Pp
1.22 aaron 427: .It Ic -user Ar uname
1.1 deraadt 428: True if the file belongs to the user
1.25 aaron 429: .Ar uname .
1.1 deraadt 430: If
431: .Ar uname
432: is numeric and there is no such user name, then
433: .Ar uname
1.16 aaron 434: is treated as a user ID.
1.1 deraadt 435: .El
436: .Pp
437: All primaries which take a numeric argument allow the number to be
1.22 aaron 438: preceded by a plus sign
439: .Pq Ql +
440: or a minus sign
441: .Pq Ql \- .
442: A preceding plus sign means
443: .Dq more than n ,
444: a preceding minus sign means
445: .Dq less than n ,
446: and neither means
447: .Dq exactly n .
1.1 deraadt 448: .Sh OPERATORS
449: The primaries may be combined using the following operators.
450: The operators are listed in order of decreasing precedence.
1.22 aaron 451: .Bl -tag -width (expression)
452: .It Cm \&( Ns Ar expression Ns Cm \&)
1.1 deraadt 453: This evaluates to true if the parenthesized expression evaluates to
454: true.
455: .Pp
1.22 aaron 456: .It Cm \&! Ns Ar expression
1.1 deraadt 457: This is the unary
458: .Tn NOT
459: operator.
460: It evaluates to true if the expression is false.
461: .Pp
1.22 aaron 462: .It Ar expression Cm -and Ar expression
463: .It Ar expression expression
1.1 deraadt 464: The
465: .Cm -and
466: operator is the logical
467: .Tn AND
468: operator.
469: As it is implied by the juxtaposition of two expressions it does not
470: have to be specified.
471: The expression evaluates to true if both expressions are true.
472: The second expression is not evaluated if the first expression is false.
473: .Pp
1.22 aaron 474: .It Ar expression Cm -or Ar expression
1.1 deraadt 475: The
476: .Cm -or
477: operator is the logical
478: .Tn OR
479: operator.
480: The expression evaluates to true if either the first or the second expression
481: is true.
482: The second expression is not evaluated if the first expression is true.
483: .El
484: .Pp
485: All operands and primaries must be separate arguments to
1.22 aaron 486: .Nm find .
1.1 deraadt 487: Primaries which themselves take arguments expect each argument
488: to be a separate argument to
1.22 aaron 489: .Nm find .
1.1 deraadt 490: .Sh EXAMPLES
491: The following examples are shown as given to the shell:
492: .Bl -tag -width findx
493: .It Li "find / \e! -name \*q*.c\*q -print"
1.22 aaron 494: Print out a list of all the files whose names do not end in
1.31 deraadt 495: .Dq \&.c .
1.1 deraadt 496: .It Li "find / -newer ttt -user wnj -print"
1.22 aaron 497: Print out a list of all the files owned by user
498: .Dq wnj
499: that are newer
500: than the file
501: .Dq ttt .
1.1 deraadt 502: .It Li "find / \e! \e( -newer ttt -user wnj \e) -print"
1.22 aaron 503: Print out a list of all the files which are not both newer than
504: .Dq ttt
505: and owned by
506: .Dq wnj .
1.1 deraadt 507: .It Li "find / \e( -newer ttt -or -user wnj \e) -print"
1.22 aaron 508: Print out a list of all the files that are either owned by
509: .Dq wnj
510: or
511: that are newer than
512: .Dq ttt .
1.1 deraadt 513: .El
514: .Sh SEE ALSO
1.29 millert 515: .Xr chflags 1 ,
1.1 deraadt 516: .Xr chmod 1 ,
517: .Xr locate 1 ,
1.23 aaron 518: .Xr whereis 1 ,
519: .Xr which 1 ,
1.1 deraadt 520: .Xr stat 2 ,
521: .Xr fts 3 ,
1.16 aaron 522: .Xr getgrent 3 ,
1.1 deraadt 523: .Xr getpwent 3 ,
524: .Xr strmode 3 ,
525: .Xr symlink 7
526: .Sh STANDARDS
527: The
1.22 aaron 528: .Nm
1.1 deraadt 529: utility syntax is a superset of the syntax specified by the
530: .St -p1003.2
531: standard.
532: .Pp
1.13 deraadt 533: The options and primaries
1.18 deraadt 534: .Ic -amin ,
535: .Ic -cmin ,
1.9 tholo 536: .Ic -empty ,
1.1 deraadt 537: .Ic -follow ,
538: .Ic -fstype ,
1.27 deraadt 539: .Ic -iname ,
1.2 deraadt 540: .Ic -inum ,
1.1 deraadt 541: .Ic -links ,
1.9 tholo 542: .Ic -ls ,
1.18 deraadt 543: .Ic -mmin ,
1.9 tholo 544: .Ic -maxdepth ,
1.13 deraadt 545: .Ic -mindepth ,
546: .Ic -execdir ,
1.1 deraadt 547: and
548: .Ic -print0
1.13 deraadt 549: are extensions to
1.1 deraadt 550: .St -p1003.2 .
1.27 deraadt 551: The
552: .Ic -iname
553: option was inspired by GNU find.
1.1 deraadt 554: .Pp
555: Historically, the
556: .Fl d ,
1.26 aaron 557: .Fl H ,
1.1 deraadt 558: and
559: .Fl x
1.14 deraadt 560: options were implemented using the primaries
561: .Ic -depth ,
562: .Ic -follow ,
563: and
564: .Ic -xdev .
1.1 deraadt 565: These primaries always evaluated to true.
566: As they were really global variables that took effect before the traversal
567: began, some legal expressions could have unexpected results.
1.22 aaron 568: An example is the expression
569: .Dq \-print \-o \-depth .
570: As
571: .Cm \-print
572: always evaluates to true, the standard order of evaluation
573: implies that
574: .Cm \-depth
575: would never be evaluated.
1.1 deraadt 576: This is not the case.
577: .Pp
1.22 aaron 578: The operator
579: .Cm -or
580: was implemented as
581: .Cm \-o ,
582: and the operator
583: .Cm -and
584: was implemented as
585: .Cm \-a .
1.1 deraadt 586: .Pp
587: Historic implementations of the
588: .Ic -exec
589: and
590: .Ic -ok
1.22 aaron 591: primaries did not replace the string
592: .Qq {}
593: in the utility name or the
1.1 deraadt 594: utility arguments if it had preceding or following non-whitespace characters.
595: This version replaces it no matter where in the utility name or arguments
596: it appears.
1.30 aaron 597: .Sh HISTORY
598: A
599: .Nm
600: command appeared in
601: .At v1 .
1.1 deraadt 602: .Sh BUGS
603: The special characters used by
1.22 aaron 604: .Nm
1.1 deraadt 605: are also special characters to many shell programs.
1.22 aaron 606: In particular, the characters
607: .Ql * ,
608: .Ql [ ,
609: .Ql \&] ,
610: .Ql ? ,
611: .Ql ( ,
612: .Ql \&) ,
613: .Ql ! ,
614: .Ql \e ,
615: and
616: .Ql \&;
617: may have to be escaped from the shell.
1.1 deraadt 618: .Pp
619: As there is no delimiter separating options and file names or file
620: names and the
621: .Ar expression ,
1.22 aaron 622: it is difficult to specify files named
623: .Dq -xdev
624: or
625: .Dq ! .
1.1 deraadt 626: These problems are handled by the
627: .Fl f
628: option and the
629: .Xr getopt 3
1.22 aaron 630: .Dq \-\-
631: construct.
1.19 espie 632: .Pp
633: The
634: .Fl W
1.26 aaron 635: option is probably not the most elegant way to handle whiteouts.
636: It may be replaced by a more sophisticated algorithm eventually.