我有一堆文件以“-e”结尾,我想删除。
$ find . -name "*-e" exec rm {} \;
find: exec: unknown primary or operator
正则表达式是否以某种方式扩展,使一切都搞砸了?
答案 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的答案。但是,在运行之前,我必须非常小心:
-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
,而不是--exec
或exec
请记住,查找选项全部用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查找版本一起使用