【问题标题】:Using operators in "find"在“查找”中使用运算符
【发布时间】:2014-09-09 16:26:57
【问题描述】:

如果之前已经介绍过,我深表歉意。我正在我的 OSX Mavericks 上学习 find。我不太确定我是否完全了解运算符。

我的文件夹有 4 个文件:

123.123
123.abc
abc.123
abc.abc

当我尝试“或”-o 运算符时:

find . \( -name "*.123" -o -name "123.*" \) -print

输出如预期:

./123.123
./123.abc
./abc.123

但是当我去掉括号/括号时,即:

find . -name "*.123" -o -name "123.*" -print

...只打印./123.abc

为什么....???我真的不明白这里的计算机是如何解释命令的。

我的观察是./123.abc 适合第二个参数(123.*),但不适合第一个参数(*.123)。所以似乎不知何故,在不带括号的第二个参数之前使用-o 会导致第一个参数表现得好像它有一个“NOT”(!) 运算符。

【问题讨论】:

  • 顺便说一下,如果你省略 -print 就像 find . -name "*.123" -o -name "123.*" 一样,你会得到预期的输出(至少在 GNU 上)

标签: macos bash find


【解决方案1】:

取出括号使-print 操作仅在此条件下执行:

-name "123.*"

哪个打印:./123.abc

【讨论】:

  • 感谢您的回复,但是如果只执行-name "123.*",那么输出不会同时打印123.abc AND 123.123
  • 它不打印 123.123 因为之前的条件 -name "*.123" 也匹配 123.123 并且由于该条件没有任何操作,所以它没有打印。如果您创建另一个文件123.aaa,它将被打印出来。
  • 好的...我明白了!因此,因为123.123 被第一个参数拾取并且没有与之相关的操作,所以什么也没做。然后同一个文件与第二个参数不匹配,因为它已经匹配了。所以我真的在表演find . -name "*.123" -o \( -name "123.*" -print \)!!太好了,现在一切都说得通了!!非常感谢您的帮助。
【解决方案2】:

这是 "and""or" 运算符之间operator precedence 的问题。

find . -name "*.123" -o -name "123.*" -print

事实上

find . -name "*.123" -o -name "123.*" -a -print

由于具有更高的优先级,这被解释为:

find . -name "*.123" -o \( -name "123.*" -a -print \)

如果您希望您的预期行为没有括号,请写下:

sh$ find . -name "*.123" -o -name "123.*"
./abc.123
./123.abc
./123.123

这里的“打印”动作是隐含的,不受分组的影响。

如果你想要完整的等价物,你可以写:

sh$ find . -name "*.123" -a -print -o -name "123.*" -a -print
./abc.123
./123.abc
./123.123

解释为:

find . \( -name "*.123" -a -print \) -o \( -name "123.*" -a -print \)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
相关资源
最近更新 更多