我已经四处寻找这个但我找不到任何关于它的东西。
我一直想知道,为什么大多数其他内置 bash 命令具有命令 -flag arg1 arg2 的格式,即 cp -r dir1/ dir2/ 但这里 find 命令以某种方式将标志放在两个之间的中间论点?
find path/ -name pattern
这对我来说是不一致的,而且很难记住。有充分的理由吗?一些我不知道的约定?
答案1
答案2
你似乎混淆了一些事情。 shell也不find
是cp
内置函数。命令中唯一的参数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
find
是cpio
由 Dick Haight 创建的,而不是由大多数原始 Unix 实用程序的编写者创建的。当时没有可以作为库链接的命令行参数解析库,这将强制/刺激一定的一致性(在 80 年代中期,我getopt
在多个系统上有源代码)
一旦人们在脚本中使用命令及其参数,就很难更改现有功能的语法。
答案4
find
不是一个简单的由选项控制的命令,而是一个实现了自己的控制语言的命令。
CLIfind
看起来像:
find [options] path1..pathn [expression]
其中选项例如-H
、-L
和-P
是expression
用find control language
.
像这样的参数-name
被称为:primaries
,因为它们是主要运算符,并且完整的表达式可以被视为过滤器和诸如-print
,之类的操作的数学描述-exec
。
这find command language
是一种非常强大但仍然易于学习的语言。遍历目录树并尝试仅通过经典 UNIX 命令行选项来实现其行为的程序通常要么功能较弱,要么难以学习。请参见例如GNU tar
vs. star
(后者支持使用find command language
.