查找:路径必须在表达式之前:'1'

时间:2019-05-13 14:51:50

标签: linux bash makefile find sh

我正在尝试运行一个名为buildAll.sh的文件,该文件应该从基准测试生成二进制文件并将其全部放入顶层目录。

#!/bin/sh

find . -d 1 -type d \( ! -name . \) -exec bash -c "cd {} && make clean && make && cp main.bin ../{}.bin && make clean" \;

但是,我得到一个错误:

find: paths must precede expression: `1'

我不确定该命令的工作方式以及修复方法。

我在Ubuntu上运行了它。 谢谢

1 个答案:

答案 0 :(得分:1)

-d-depth的同义词,-表示首先处理最深的-,并且不接受参数。放下1,就可以了。例如:

find . -d -type d \( ! -name . \) -exec bash -c "cd {} && make clean && make && cp main.bin ../{}.bin && make clean" \;

如果您愿意接受建议,我有两个建议:

  1. 不要将此脚本限制为bash,任何POSIX shell都可以使用bash来完成您的工作,因此请使用sh
  2. POSIX specification of find中指出:

      

    如果某个utility_name或参数字符串包含两个字符“ {}”,而不仅仅是两个字符“ {}”,则实现定义是find替换这两个字符还是使用不变的字符串。

    即使您可以将位置参数传递给外壳,您基本上也依赖于实现定义的功能。

因此,我将改为执行以下操作:

find -d -type d \( ! -name '.' \) -exec sh -c 'cd "$1" && make clean && make && cp main.bin "../$1.bin" && make clean' _ {} \;