找到工作,但发现-exec没有

时间:2014-06-05 22:46:21

标签: macos shell find args

我正在尝试查找给定文件夹的子文件夹中的所有图像,并将它们移动到其他位置。我在运行OS X 10.9.3的Mac上zsh(我的默认值)和sh(大多数教程似乎都在使用)中尝试了以下内容。

这会打印出$someDir

子文件夹中的所有图片
find "$someDir" -iname \*.jpg -o -name \*.png -o -name \*.gif

然而,当我想将这些图像传递给另一个命令时,我无法让它工作。作为练习,我尝试使用echo

find "$someDir" -iname \*.jpg -o -name \*.png -o -name \*.gif -exec sh -c "echo hello {}" \;

它只是静默返回,$?的值为0

我最终想要沿着这些方向做点什么:

find "$someDir" -iname \*.jpg -o -name \*.png -o -name \*.gif -exec sh -c "mv {} $destination" \;

但我甚至无法让echo示例起作用。我做错了什么?

2 个答案:

答案 0 :(得分:2)

您需要在所有名称测试周围添加括号:

find "$someDir" \( -iname \*.jpg -o -name \*.png -o -name \*.gif \) -exec sh -c "echo hello {}" \;

否则,仅对匹配-exec的文件执行*.gif

当您忽略该操作时,-print的每个分支中都有默认-o。但是,如果命令中有任何操作选项,则无处可选。

答案 1 :(得分:1)

这些应该有效(确保$ destination已定义)

find "$someDir" \( -iname \*.jpg -o -name \*.png -o -name \*.gif \) -exec echo hello {}
find "$someDir" \( -iname \*.jpg -o -name \*.png -o -name \*.gif \) -exec mv {} $destination \;