find -name“* .xyz”-o -name“* .abc”-exec在所有find的文件上执行,而不仅仅是指定的最后一个后缀

我试图跑

find ./ -name "*.xyz" -o -name "*.abc" -exec cp {} /path/i/want/to/copy/to 

实际上,这是一个更大的名称扩展列表,但我不知道这个例子。 基本上我想复制所有发现到另一个/path/我/要/到/复制/到。 但是,它似乎只执行列表中的最后一个名称testing。

如果我删除了-exec部分,所有我期望find的文件变体都会被打印出来。

我怎样才能让它通过发现的全部文件到-exec?

通过评估你给出的表达式来find作品,直到它可以确定整个表达式的真值(真或假)。 在你的情况下,你基本上是做下面的事情,因为默认情况下它将表达式和在一起。

 -name "*.xyz" OR ( -name "*.abc" AND -exec ... ) 

请参阅手册页:

GNU find根据优先级规则(见OPERATORS部分)评估给定的表达式来搜索以每个给定文件名为根的目录树,直到结果是已知的(左手边对于操作是错误的,对或),在这一点上找到移动到下一个文件名。

这意味着,如果名称匹配*.xyz ,它甚至不会尝试检查后者名称测试或-exec ,因为它已经是真的。

你想要做的是强制优先,你可以用括号做。 令人烦恼的是,您还需要使用反斜杠在外壳上转义它们:

 find ./ \( -name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \; 

比Jaypal的解决方案更有用可能是:

  find ./ -regex ".*\.\(jpg\|png\)" -exec cp {} /path/to 
 find . \( -name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \; 

它可能工作:

 find ./ -name "*.{xyz,abc}" -exec cp {} /path/i/want/to/copy/to