find: пути должны предшествовать выражению: `1 '

Я пытаюсь запустить файл вызова 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 ответ


-d является синонимом -depth , -depth означает обрабатывать самый глубокий первый - и не требует аргумента. Брось 1 и все готово. Например:

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

И если вы открыты для предложений, у меня есть два из них:

  1. Не ограничивайте этот скрипт bash, любая оболочка POSIX может делать то же, что и вы с bash, поэтому используйте вместо sh ,
  2. В спецификации POSIX find указано, что:

    Если имя_программы или строка аргумента содержит два символа «{}», а не только два символа «{}», то определяется реализацией , заменяет ли find эти два символа или использует строку без изменений.

    Вы в основном полагаетесь на особенность, определяемую реализацией , даже если вы можете передавать позиционные параметры в оболочку.

Итак, я бы сделал что-то вроде этого:

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

Есть идеи?

10000