POSIX Find Parameters – Why They Differ from Other Program Styles

findhistoryparameterposix

Why is a parameter in the POSIX find command added with a single hyphen for multi-character parameter names, while most other programs use single hyphen to indicate multiple single-character flags, and double-hyphens to indicate single parameter names with multiple characters?

This seems inconsistent, and I'm curious as to

A. why it's really not inconsistent, or
B. the history of that decision.

Best Answer

Note that POSIX find does support options like other commands, and -- to mark the end of them like other commands. Those are -H and -L.

The -print, -type... are not options, they're sometimes called predicates. They are arguments whose order matters that appear after the file paths which themselves appear after the options. You've also got ( and !. Together, they build an expression that is used to determine what files to find.

find is not the only one. [ (aka test) and expr are other commands whose arguments are used to build an expression.

Like find, [ has operators that start with - and are more than one-letter (-gt, -eq...).

Like find, test has issues where those operators may be confused with operands.

find -- "$file1" "$file2" -type f
[ -f "$file1" -a -f "$file2" ]

If $file2 is !, it's a problem with find. If it's =, it's a problem with (some) [.

For all of find, test and expr, using options to build the expression would not really have worked. Another option could have been to have one string evaluated as the expression like awk or sed. like for

find f1 f2 \( -type f -mtime -1 -o ! -type f -newer x \) -exec ls -ld {} +

Do:

find 'found = 0
      if (typeof($f) == "f") {
        if (age($f) > 1) found=1
      } else if (age($f) < age("x")) found = 1
      if ($found) exec_multi("ls -ld {}")' f1 f2

But that means implementing a grammar parser in find. That also means potential quoting nightmare for the "x" and command line above.

Actually AT&T Research did come up with such a command: tw (tree walker), but even though it's now open source, I'm not aware that it is really used out of AT&T.