find -name"*.xyz"-o -name"*.abc"-exec to对所有找到的文件执行,而不仅仅是指定的最后一个后缀

atx*_*dba 41 linux bash shell scripting

我想跑

find ./ -name "*.xyz" -o -name "*.abc" -exec cp {} /path/i/want/to/copy/to
Run Code Online (Sandbox Code Playgroud)

实际上它是一个更大的名称扩展列表,但我不知道这个例子的重要性.基本上我想把所有找到的东西复制到另一个/ path/i/want/to/copy/to.但是它似乎只是在列表中执行最后一个名称测试.

如果我删除-exec部分,我打算找到我希望找到的所有文件变体.

如何让它传递给-exec的完整文件?

Dan*_*ego 55

find通过评估你给它的表达式来工作,直到它可以确定整个表达式的真值(真或假).在您的情况下,您实际上是在执行以下操作,因为默认情况下它将表达式和.

-name "*.xyz" OR ( -name "*.abc" AND -exec ... )
Run Code Online (Sandbox Code Playgroud)

手册页:

GNU find根据优先级规则(参见OPERATORS部分)从左到右评估给定的表达式,搜索以每个给定文件名为根的目录树,直到结果已知(左侧为false,为操作,对于or)为true,此时find将移至下一个文件名.

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

您要做的是强制执行优先级,您可以使用括号.令人讨厌的是,你还需要使用反斜杠来逃避shell上的反斜杠:

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

  • `-exec cp -t dir {} +`可能更有效率 (4认同)

use*_*own 16

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

   find ./ -regex ".*\.\(jpg\|png\)" -exec cp {} /path/to
Run Code Online (Sandbox Code Playgroud)

  • 是的,你的解决方案更好.我会继续删除我的.+1 (3认同)

Rob*_*ers 8

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