在这个答案-!
, 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)。它并没有颠倒感叹号 (!) 的含义。