osx find exec rm find: exec: 未知的主要或运算符

osx find exec rm find: exec: unknown primary or operator

我有一堆以“-e”结尾的文件想要删除。

$ find . -name "*-e" exec rm {} \;
find: exec: unknown primary or operator

正则表达式是否以某种方式扩展导致一切混乱?

应该是:

find . -name "*-e" -exec rm '{}' \;

或更好:

find . -name "*-e" -exec rm '{}' +

根据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).

只需使用:find . "*-e" -type f exec rm '{}' + 它适用于 Mac OSX 查找版本

+1 @anubhava 的回答。但是,在它起作用之前我确实必须非常小心:

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

一旦成功,您就可以使用额外的查找选项,如

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 不知道发生了什么,所以你得到一个通用的 I don't know 消息。

一旦您使用 -exec \; 终止 - space 是关键

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

find: -exec: no terminating ";" or "+"
.........你想在你的错误信息中看到 -exec。那部分很好 ✅ find 知道它在看什么所以它有 -exec 相关消息。

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

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

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

可能,在某些情况下,如果你的路径中有 space,所以如果你不确定,请加上引号。但是即使使用 spaces 并且使用与 echo.

不同的命令(cat,ls),我也无法触发任何错误

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

./bar zoom.sh
./foo.sh
./worklocal.sh

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

./bar zoom.sh
./foo.sh
./worklocal.sh

我不是说引号没用,我是说它们不会导致 未知的主要或运算符

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

不要忘记 +.

之前的 space

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

./bar zoom.sh ./foo.sh ./worklocal.sh

是的,我梦想有一个更加用户友好的查找工具。但是macos的Spotlight相关mdfind is, by light-years, even more unfriendly when it comes to options

使用查找删除参数:

find ./ -name "*-e" -delete