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)
use*_*own 16
比Jaypal的解决方案更有用的可能是:
find ./ -regex ".*\.\(jpg\|png\)" -exec cp {} /path/to
Run Code Online (Sandbox Code Playgroud)
find . \( -name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30085 次 |
| 最近记录: |