osx find exec rm find:exec:unknown primary或​​operator

fre*_*ull 23 unix bash rm find

我有一堆以"-e"结尾的文件要删除.

$ find . -name "*-e" exec rm {} \;
find: exec: unknown primary or operator
Run Code Online (Sandbox Code Playgroud)

正则表达式是否以某种方式扩展,将一切都搞砸了?

anu*_*ava 35

它应该是:

find . -name "*-e" -exec rm '{}' \;
Run Code Online (Sandbox Code Playgroud)

或更好:

find . -name "*-e" -exec rm '{}' +
Run Code Online (Sandbox Code Playgroud)

按照man find:

-exec utility [argument ...] {} +
   Same as -exec, except that ``{}'' is replaced with as many pathnames as possible for 
   each invocation of utility. This behaviour is similar to that of xargs(1).
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但是我都遇到了同样的错误。:( (2认同)

JL *_*ret 6

对@anubhava 的回答+1。然而,在它起作用之前我必须非常小心:

TLDR:格式为 -exec <your-command> {} \;

提示:使用无害的东西,比如echo先让它发挥作用。

find . -name "*.sh" -exec echo {} \;

./081.documentation/000.sticky.list_url_info_markdown/worklocal.sh
./081.documentation/001.fixed.p2.collab_diagrams/common.sh
./081.documentation/001.fixed.p2.collab_diagrams/worklocal.sh
Run Code Online (Sandbox Code Playgroud)

一旦它起作用,你就可以通过额外的查找选项获得所有的乐趣,如下所示

find . -name "*.sh" -maxdepth 3 -exec echo {} \;

请务必使用-exec, 而不是--execexec

请记住,find 的选项都需要 1 个破折号。 -exec没有什么不同。

find . -name "*.sh" --exec echo {} \;

find: --exec: unknown primary or operator

find . -name "*.sh" exec echo {} \;

find: exec: unknown primary or operator

请注意find:之后的内容如何反映您输入的内容?这里 find 不知道发生了什么,所以你会收到一条通用的“我不知道”消息。

一旦你使用-exec终止 \;- 这个空间就很关键

find . -name "*.sh" -exec echo {}\;

?......................你想在错误消息中find: -exec: no terminating ";" or "+"
看到。-exec那部分好吗?find 知道它正在查看什么,因此它具有-exec相关消息。

最后,替换echo为您的实际有效负载:

find . -name "*.sh" -exec reformat.py --myfancy-option-to-reformat {} \;

“{}”与 {} 没有任何区别。

在某些情况下,如果您的路径中有空格,那么如果您不确定是否要加引号,则可能会这样。但即使使用空格和使用与 echo 不同的命令(cat、ls),我也无法触发任何错误。

find . -name "*.sh" -exec echo {} \;

./bar zoom.sh
./foo.sh
./worklocal.sh
Run Code Online (Sandbox Code Playgroud)

find . -name "*.sh" -exec echo '{}' \;

./bar zoom.sh
./foo.sh
./worklocal.sh
Run Code Online (Sandbox Code Playgroud)

我并不是说引号没有用,我是说它们不会导致未知的primary 或operator

+删除调用之间的换行符结尾:

不要忘记 + 之前的空格。

find . -name "*.sh" -exec echo {} +

./bar zoom.sh ./foo.sh ./worklocal.sh
Run Code Online (Sandbox Code Playgroud)

是的,我梦想有一个更加用户友好的发现。但是 macos 的 Spotlight 相关的mdfind 在选项方面更加不友好