为什么是 find dir -name file 而不是 find -n dir file?

为什么是 find dir -name file 而不是 find -n dir file?

我已经四处寻找这个但我找不到任何关于它的东西。

我一直想知道,为什么大多数其他内置 bash 命令具有命令 -flag arg1 arg2 的格式,即 cp -r dir1/ dir2/ 但这里 find 命令以某种方式将标志放在两个之间的中间论点?

find path/ -name pattern

这对我来说是不一致的,而且很难记住。有充分的理由吗?一些我不知道的约定?

答案1

命令先出现,一致性随后添加。

您可能找到的最早的联机帮助页显示为

find 路径名表达式

find可以追溯到 20 世纪 70 年代,各种命令中都添加了排序甚至语法(选项是否需要破折号)的假设之后(比如在 20 世纪 80 年代末和 90 年代初)帮助用户记住各种命令的语法。例如,在 的情况下find,开发人员意识到一些不一致之处:

错误
无法检查设备类型。
语法应与如果

因此,正确的答案是该命令对原始开发人员有意义,并且没有进行重大更改。

答案2

你似乎混淆了一些事情。 shell也不findcp内置函数。命令中唯一的参数find是路径,其余的是选项及其值,但这只是语义,这里的区别不是很重要。更重要的是,有两类选项标志。那些接受争论的人和那些不接受争论的人。对于那些这样做的人,最常见的格式是:

command -flag flagValue

虽然许多程序采用单字母标志 ( command -f),但许多程序同时采用单字母和长选项(例如,几乎所有 GNU 工具)。您提到cp,这是一个有效的cp命令:

cp -dR --preserve=all -i --dereference foo bar baz/

一般来说,最常见的“标准”格式实际上是:

command -flag1 -flag2 value1 -flag3 value2 ARGUMENTS

换句话说,许多标志不是简单的布尔值,也可以取值。Find 也不例外。即使cp您引用的标志也是如此:

cp -t /foo -u file1 file2 fileN

因此,大多数命令的格式并不正确command -flag arg1 arg2,事实上恰恰相反。这仅取决于所使用的标志。至于find开发者为什么选择这种特殊的格式,恐怕你得问他们了。

答案3

findcpio由 Dick Haight 创建的,而不是由大多数原始 Unix 实用程序的编写者创建的。当时没有可以作为库链接的命令行参数解析库,这将强制/刺激一定的一致性(在 80 年代中期,我getopt在多个系统上有源代码)

一旦人们在脚本中使用命令及其参数,就很难更改现有功能的语法。

答案4

find不是一个简单的由选项控制的命令,而是一个实现了自己的控制语言的命令。

CLIfind看起来像:

find [options] path1..pathn [expression]

其中选项例如-H-L-Pexpressionfind control language.

像这样的参数-name被称为:primaries,因为它们是主要运算符,并且完整的表达式可以被视为过滤器和诸如-print,之类的操作的数学描述-exec

find command language是一种非常强大但仍然易于学习的语言。遍历目录树并尝试仅通过经典 UNIX 命令行选项来实现其行为的程序通常要么功能较弱,要么难以学习。请参见例如GNU tarvs. star(后者支持使用find command language.

相关内容