因此,当我忘记如何运行某个命令时,我一直试图养成在开始谷歌之前先查看手册页的习惯。
我今天查看了 find 命令的手册页,在概要部分中,它将命令的格式指定为:
SYNOPSIS
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
这不是表明选项必须位于路径之前,然后是表达式吗?或者大纲没有指定顺序?
当我使用 find 时,我必须在选项之前指定路径,如下所示:
find . -cmin -10 -ls
答案1
-cmin
并且-ls
是谓词是其中的一部分表达,不是选项。
请注意,您可以使用 标记选项的结尾--
,但在其后仍然允许使用谓词。
使用 GNU find
,允许省略路径:
find -- -L
会抱怨未知 -L 谓词(尽管-L
是有效的选项实际上有一个-follow
等价的谓词)。
这就是为什么虽然
find "$file"
喜欢
wc "$file"
$file
以 开头时无法正常工作-
。
这样做wc -- "$file"
可以修复它wc
(除了 的特殊情况file='-'
),但不能修复它find -- "$file"
。 FreeBSDfind
已经做到了find -f "$file"
这一点。
答案2
该find
命令非常古老,可以追溯到Unix V5。当时,命令行语法约定还没有像现在这样牢固建立。一些旧程序偏离了这些约定。
原本,find
没有选择。它期望第一个参数是要遍历的目录,其余参数是表达式。计算每个文件的表达式指示是否应打印该文件(或者更一般地指示如何处理该文件)。该表达式由运算符及其操作数组成。查找运算符以 开头-
(除了一些标点符号),原因与选项以-
: 开头的原因相同,因为它在 shell 中没有任何特殊含义,因此很容易键入,但它可以与文件名区分开来,因为理性的人不会这样做t 以-
.开头的文件名
运营商不是选项。为什么?因为它们没有选项的语法...它们有选项的拼写(以 开头-
),但它们在不同的上下文中使用。
后来find
获得了一些可以被视为选项的东西 - 像-depth
这样的全局设置实际上在表达式中没有任何业务。这些被放入表达式中是为了保持一致性,因为find
没有选项。
再后来,find
获得了一些选项,使用通常的选项语法:选项在非选项之前。这样做是为了与支持相同选项(-H
并-L
配置符号链接行为)的许多其他程序保持一致。
概要告诉你这些-H
,-L
等等能首先是路径,然后是表达式。概要语法并不总是能表达所有的可能性。如果它是完整的,它将无法阅读,所以你所知道的就是它提供了一种可能性。如果您想确切地知道什么是可能的,什么是不可能的,您需要进一步阅读。例如,-H
、-L
等可以按任何顺序出现,只要它们位于路径之前即可。