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

时间:2015-01-13 05:50:59

标签: bash unix find rm

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

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

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

4 个答案:

答案 0 :(得分:29)

应该是:

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

答案 1 :(得分:4)

+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

请记住,查找选项全部用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不知道发生了什么,因此您会收到一条通用的我不知道消息。

一旦您使用-exec,以 \;结尾-空格很关键

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

find: -exec: no terminating ";" or "+"
.................?您想在错误消息中看到-exec。该部分很好-✅知道自己在看什么,因此它具有-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

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

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

我并不是说引号是无用的,不是说引号不是引起主要或运算符的原因。

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

别忘了+之前的空格。

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

答案 2 :(得分:2)

使用查找删除参数:

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

答案 3 :(得分:-1)

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