find: пути должны предшествовать выражению: `1 ' - PullRequest
0 голосов
/ 13 мая 2019

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

1 голос
/ 13 мая 2019

-d является синонимом -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' _ {} \;
...