苹果电脑操作系统中查找并删除文件时出现错误:find:exec:未知的primary或operator。

45

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

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

正则表达式是否会以某种方式扩展,从而搞乱一切?


参见这个问题,但是不需要特别处理,因为{}将扩展为./some/path/-e,它不能被视为一个选项。 - Reinstate Monica Please
4
当我在寻找findexec的使用示例时,无意中遇到了这个问题,忽略了您正在执行rm的事实!温馨提示:这个命令会删除目录的所有内容!如果你只是在尝试破解,请谨慎使用。我曾经吃过苦头。 - Eric
我忘记在我的“-name”参数值周围使用引号。星号被Shell扩展而不是由“find”扩展。 - Elijah Sink
4个回答

55

应该是:

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

6
谢谢,但是对于这两个,我得到了同样的错误信息。:( - freedrull
我也是:$ find . -name *.m4 查找:ad.m4:未知的主要或运算符 - dba.in.ua
@dba.in.ua:在您的shell上,type find的输出是什么? - anubhava
1
对于像 find ~ -iname "*.py" 这样的查找查询问题,我只需要引用文件名序列就可以让它工作。当我运行它时,{} 不需要加引号。 - wesinat0r

15

+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的所有选项都要带一个破折号。 -exec并没有什么不同。

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

find: --exec: 未知的关键字或运算符

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

find: exec: 未知的关键字或运算符

注意,find:后面跟着的是你输入的内容。如果find不知道发生了什么,那么会出现一条通用的我不知道消息。

一旦你使用了-exec,就以 \;结束——这个空格很重要

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

find: -exec: 没有结束符号";"或"+"
................. 你想在错误消息中看到-exec。这部分是正确的✅,find知道它所看到的与-exec相关的信息。

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

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

'{}'与{}没有任何区别。

也许在某些情况下会有所不同,比如如果你的路径中有空格,那么如果不确定,请使用引号。但是,即使用不同的命令(cat、ls)来代替echo,甚至带有空格,我也无法触发任何错误。

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

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

查找当前目录下所有以.sh结尾的文件,并对每一个文件执行echo命令

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

我并不是在说这些引用没有用处,我是在说它们并没有导致未知的主要或运算符

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

别忘了那个加号前面的空格。

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

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

是的,我梦想有一个更加用户友好的查找工具。但是macOS相关的Spotlight mdfind 在选择方面比光年还要不友好。


3

使用find删除参数:

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

-3

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


1
需要使用-exec而不是exec - JL Peyret

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接