为什么 POSIX 查找参数与其他程序样式不同?

Jon*_*nah 4 find parameter history posix

为什么 POSIXfind命令中的一个参数添加一个单连字符表示多字符参数名称,而大多数其他程序使用单连字符表示多个单字符标志,而双连字符表示多个字符的单个参数名称?

这似乎不一致,我很好奇

A. 为什么它真的不矛盾,或者
B. 那个决定的历史。

Sté*_*las 6

请注意,POSIX find 确实支持像其他命令一样的选项,并像其他命令一样--标记它们的结尾。那些是-H-L

-print-type......是不是选项,他们有时也被称为谓词。它们是出现在文件路径之后的参数,其顺序很重要,文件路径本身出现在选项之后。你还有(!。他们一起构建了一个表达式,用于确定要查找的文件。

find不是唯一的。[(aka test) 和expr其他命令,其参数用于构建表达式

find, [具有以-和 多个字母 ( -gt, -eq...)开头的运算符。

例如findtest存在那些运算符可能与操作数混淆的问题。

find -- "$file1" "$file2" -type f
[ -f "$file1" -a -f "$file2" ]
Run Code Online (Sandbox Code Playgroud)

如果$file2!,则是 的问题find。如果是=,则是 (some) 的问题[

对于所有find,testexpr,使用选项来构建表达式不会真正起作用。另一种选择可能是将一个字符串评估为表达式,如awkor sed。像

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

做:

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
Run Code Online (Sandbox Code Playgroud)

但这意味着在find. 这也意味着"x"上面和命令行的潜在引用噩梦。

实际上 AT&T Research 确实想出了这样一个命令:tw (tree walker),但即使它现在是开源的,我也不知道它是否真的在 AT&T 之外使用。


Gil*_*il' 6

find早于--用于多字母选项的 GNU 约定。GNU 引入这个约定是为了打破具有单字母选项的程序之间的现有不一致,这-bar意味着三个选项-b -a -r,以及具有多字母选项的程序,这-bar意味着该名称的单个选项。到 GNU 出现时,它可能会影响未来的程序,但不会改变现有的程序,find例如 X11 实用程序或其他程序。

find用作-谓词和动作的前缀,因为它们有点像选项:它们是关键字,是对特定命令有意义的有限集的一部分。虽然它们不像选项那样被解析,但它们在字典上像选项。