`find -! 中的减号 (-) 有何用途? -exec`服务?

`find -! 中的减号 (-) 有何用途? -exec`服务?

这个答案-!, in有什么用find

考虑以下代码:

find . -type l -! -exec test -e {} \; -print

这个替代方案似乎做了同样的事情:

find . -type l ! -exec test -e {} \; -print

看起来-!!,意思是以下表达式的否定。这是有道理的。但为什么不就!在那时呢?我似乎找不到有关此类语法的任何文档。

答案1

-!除了标准之外还接受!(对于其他标点符号运算符也同样如此:()和 GNU 特定的,)是 GNU find 的命令行解析器的一个怪癖。如果代码不拒绝-!等格式不正确的情况,那么编写起来会稍微容易一些。由于-!否则会出现错误,因此接受它并没有什么坏处。 POSIX 标准没有说明其含义-!:就标准而言,它是一个实现定义的谓词,实现可以自由地使用它们来表示任何他们想要的含义。

以下是 GNU find 中的代码如何工作的概述:

  • 解析器代码包含一个运营商名单。运算符存储时不带前导-,以使代码稍微更小、更快。
  • 命令行解析器来电looks_like_expression确定一个参数是否看起来像一个谓词。谓词以 开头-,单标点字符运算符除外。
  • 一旦谓词确定,find_parser忽略前导-(如果有)。这就是!和之间的区别-!消失的地方。

looks_like_expression或者find_parser可以拒绝-后跟一个标点符号。但无论哪种方式,都需要额外的代码,但没有任何实际好处。

答案2

这 -!否定表达式“-type l”,这意味着在您的示例中“列出不是链接的所有条目”。

-type l 仅当“文件”是链接时才变为 true,-!会否定它。

从查找联机帮助页:

The POSIX standard specifies parentheses `(', `)', negation `!' and the `and' and `or' operators ( -a, -o).

减号是选项的分隔符。与任何其他命令一样,每个选项都用减号分隔(例如 ls -l)。它并没有颠倒感叹号 (!) 的含义。

相关内容